Какое правильное регулярное выражение должно соответствовать всем строчным буквам utf-8 / unicode? - PullRequest
20 голосов
/ 07 марта 2011

Я бы хотел сопоставить все строчные буквы в латинском блоке. Тривиальный '[a-z]' соответствует только символам между U + 0061 и U + 007A, а не всем другим строчным формам.

Я бы хотел сопоставить все строчные буквы, а главное - все строчные буквы с акцентом в латинском блоке, используемые в языках EFIGS.

[a-zà-ý] - это начало, но все еще есть тонны других строчных букв (см. http://www.unicode.org/charts/PDF/U0000.pdf). Есть ли рекомендуемый способ сделать это?

К вашему сведению, я использую Python, но подозреваю, что эта проблема междисциплинарная.

Встроенный в Python метод islower (), кажется, выполняет правильную проверку:

lower = ''
for c in xrange(0,2**16): 
  if unichr(c).islower(): 
    lower += unichr(c)

print lower 

Ответы [ 4 ]

11 голосов
/ 08 марта 2011

Python в настоящее время не поддерживает свойства Юникода в регулярных выражениях. См. этот ответ для ссылки на библиотеку Ponyguruma , которая их поддерживает.

Используя такую ​​библиотеку, вы можете использовать \p{Ll} для сопоставления любой строчной буквы в строке Unicode.

Каждый символ в стандарте Unicode относится только к одной категории. \p{Ll} - это категория строчных букв, тогда как \p{L} содержит все символы в одной из категорий «Буквы» (Буква, прописная буква; Буква, строчная буква; Буква, заглавная буква; Буква, модификатор; и Буква, другая) Для получения дополнительной информации см. Главу «Свойства символов» Стандарт Unicode . Или см. на этой странице для хорошего объяснения использования Юникода в регулярных выражениях.

8 голосов
/ 12 июня 2013

Выглядит так, как будто этот рецепт , опубликованный в старой версии 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 голосов
/ 07 марта 2011

Возможно, вы захотите взглянуть на регулярные-выражения.info .

Однако, насколько я знаю, нет ни одного класса символов или модификатора, который выражает «только символы нижнего регистра» (и не каждый язык имеет символы нижнего регистра), поэтому я бы сказал, что вам, возможно, придетсяиспользовать несколько диапазонов (возможно почти столько же, сколько существует блоков Юникода.

Редактировать: читая немного больше об этом, может быть способ: [\p{Ll}\p{Lo}], что означает строчные буквы с заглавными буквамиили символы, которые не имеют строчных и прописных букв (например, для китайских символов).

Regex [\p{Ll}\p{Lo}]+ соответствует тестовой строке àÀhelloHello你好Прывітанне, а замена совпадений на x приводит к xÀxHxПx тогда как замена совпадений [\p{Ll}]+ приводит к xÀxHx你好Пx (обратите внимание на китайские символы, которые не были сопоставлены).

0 голосов
/ 07 марта 2011

если вы используете \p{L}, оно будет соответствовать любой букве Юникода.посмотрите примеры здесь .Вы также можете комбинировать его с \p{M} для соответствия языкам иврит-эскве, которые содержат диакритические знаки.(\p{L}|\p{M})+

РЕДАКТИРОВАТЬ:

Я пропустил часть только строчные буквы в первый раз.\p{L} будет соответствовать всем буквам, \p{Ll} будет соответствовать только строчным буквам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...