Какое правильное регулярное выражение соответствует всем формам букв utf-8/unicode в нижнем регистре
Я хотел бы сопоставить все строчные буквы в латинском блоке. Тривиальный "[a-z]" соответствует только символам между U + 0061 и U + 007A, а не ко всем другим строчным формам.
Я хотел бы совместить все строчные буквы, самое главное, все акцентированные строчные буквы в латинском блоке, используемом на языках EFIGS.
[a-zà-ý] - это начало, но все еще есть тонны других строчных символов (см. http://www.unicode.org/charts/PDF/U0000.pdf). Есть ли рекомендуемый способ сделать это?
FYI Я использую Python, но я подозреваю, что эта проблема кросс-языковая.
Встроенный в Python метод "islower()" делает правильную проверку:
lower = ''
for c in xrange(0,2**16):
if unichr(c).islower():
lower += unichr(c)
print lower
Ответы
Ответ 1
В настоящее время Python не поддерживает свойства Unicode в регулярных выражениях. См. этот ответ для ссылки на библиотеку Ponyguruma, которая их поддерживает.
Используя такую библиотеку, вы можете использовать \p{Ll}
для сопоставления любой строчной буквы в строке Unicode.
Каждый символ в стандарте Unicode находится в одной категории. \p{Ll}
- это категория строчных букв, а \p{L}
содержит все символы в одной из категорий "Письмо" (буква, прописная буква, буква, строчная буква, буква, заголовок, буква, модификатор и буква, другое). Для получения дополнительной информации см. Главу "Свойства персонажа" в Unicode Standard. Или посмотрите эту страницу для хорошего объяснения использования Unicode в регулярных выражениях.
Ответ 2
Похоже, что этот рецепт отправлен назад в старом 2005 году
import sys, re
uppers = [u'[']
for i in xrange(sys.maxunicode):
c = unichr(i)
if c.isupper(): uppers.append(c)
uppers.append(u']')
uppers = u"".join(uppers)
uppers_re = re.compile(uppers)
print uppers_re.match('A')
по-прежнему имеет значение.
Ответ 3
Возможно, вам стоит взглянуть на regular-expressions.info.
Однако, насколько я знаю, нет символьного класса или модификатора, который выражает только символы нижнего регистра (а не каждый язык имеет символы нижнего регистра), поэтому я бы сказал, что вам, возможно, придется использовать несколько диапазонов (возможно, почти столько же, сколько блоков юникода.
Изменить:
читайте немного больше об этом, может быть способ: [\p{Ll}\p{Lo}]
, который означает строчные буквы с вариантами верхнего регистра или символы, которые не имеют нижнего регистра и верхнего регистра (например, для китайских символов).
Regex [\p{Ll}\p{Lo}]+
соответствует тестовой строке àÀhelloHello你好Прывітанне
и заменяет совпадения с результатами x
в xÀxHxПx
, тогда как замена совпадений [\p{Ll}]+
приводит к xÀxHx你好Пx
(обратите внимание на китайские символы, которые не были сопоставлены).
Ответ 4
если вы используете \p{L}
, он будет соответствовать любой букве юникода. проверьте примеры здесь. Вы также можете объединить его с \p{M}
, чтобы соответствовать языкам иврита-esqe, которые включают диакритические знаки. (\p{L}|\p{M})+
EDIT:
Я пропустил часть только прописных букв в первый раз. \p{L}
будет соответствовать всем письмам, \p{Ll}
будет соответствовать только строчным.