Подтвердить что ты не робот

Какое правильное регулярное выражение соответствует всем формам букв 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 
4b9b3361

Ответ 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} будет соответствовать только строчным.