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

Python-re: Как я могу сопоставить альфа-символ

Как я могу сопоставить альфа-символ с регулярным выражением. Я хочу символ, который находится в \w, но не находится в \d. Я хочу, чтобы он совместим с Unicode, поэтому я не могу использовать [a-zA-Z].

4b9b3361

Ответ 1

Ваши первые два предложения противоречат друг другу. "in \w, но не находится в \d", включает символ подчеркивания. Я предполагаю из вашего третьего предложения, что вы не хотите подчеркивать.

Использование диаграммы Венна на обратной стороне конверта помогает. Давайте посмотрим, чего мы НЕ хотим:

(1) символы, которые не соответствуют \w (т.е. не хотят ничего, кроме альфа, цифр или подчеркивания) = > \w
(2) цифры = > \d
(3) подчеркивание = > _

Итак, что мы не хотим, это что-то в классе символов [\W\d_], и, следовательно, то, что мы хотим, есть что-либо в классе символов [^\W\d_]

Вот простой пример (Python 2.6).

>>> import re
>>> rx = re.compile("[^\W\d_]+", re.UNICODE)
>>> rx.findall(u"abc_def,k9")
[u'abc', u'def', u'k']

Дальнейшая разведка выявляет несколько причуд этого подхода:

>>> import unicodedata as ucd
>>> allsorts =u"\u0473\u0660\u06c9\u24e8\u4e0a\u3020\u3021"
>>> for x in allsorts:
...     print repr(x), ucd.category(x), ucd.name(x)
...
u'\u0473' Ll CYRILLIC SMALL LETTER FITA
u'\u0660' Nd ARABIC-INDIC DIGIT ZERO
u'\u06c9' Lo ARABIC LETTER KIRGHIZ YU
u'\u24e8' So CIRCLED LATIN SMALL LETTER Y
u'\u4e0a' Lo CJK UNIFIED IDEOGRAPH-4E0A
u'\u3020' So POSTAL MARK FACE
u'\u3021' Nl HANGZHOU NUMERAL ONE
>>> rx.findall(allsorts)
[u'\u0473', u'\u06c9', u'\u4e0a', u'\u3021']

U + 3021 (HANGZHOU NUMERAL ONE) обрабатывается как числовое (следовательно, оно соответствует \w), но кажется, что Python интерпретирует "цифру" как "десятичную цифру" (категория Nd), поэтому она не соответствует \d

U + 2438 (CIRCLED LATIN SMALL LETTER Y) не соответствует \w

Все идеограммы CJK классифицируются как "буквы" и, таким образом, соответствуют \w

Означает ли какой-либо из вышеуказанных 3 пунктов или нет, этот подход лучше всего выйдет из модуля re, как в настоящее время выпущен. Синтаксис, такой как \p {letter}, будет в будущем.

Ответ 2

Как насчет:

\p{L}

Вы можете использовать этот документ в качестве ссылки: Unicode Regular Expressions

EDIT: Кажется, Python не обрабатывает Unicode-выражения. Посмотрите на эту ссылку: Обработка акцентированных символов с регулярными выражениями Python - [AZ] просто недостаточно хороша (больше не активен, ссылка на интернет-архив)

Другие ссылки:


Для потомков, вот примеры в блоге:

import re
string = 'riché'
print string
riché

richre = re.compile('([A-z]+)')
match = richre.match(string)
print match.groups()
('rich',)

richre = re.compile('(\w+)',re.LOCALE)
match = richre.match(string)
print match.groups()
('rich',)

richre = re.compile('([é\w]+)')
match = richre.match(string)
print match.groups()
('rich\xe9',)

richre = re.compile('([\xe9\w]+)')
match = richre.match(string)
print match.groups()
('rich\xe9',)

richre = re.compile('([\xe9-\xf8\w]+)')
match = richre.match(string)
print match.groups()
('rich\xe9',)

string = 'richéñ'
match = richre.match(string)
print match.groups()
('rich\xe9\xf1',)

richre = re.compile('([\u00E9-\u00F8\w]+)')
print match.groups()
('rich\xe9\xf1',)

matched = match.group(1)
print matched
richéñ

Ответ 3

Вы можете использовать одно из следующих выражений для соответствия одной букве:

(?![\d_])\w

или

\w(?<![\d_])

Здесь я сопоставляюсь для \w, но убедитесь, что [\d_] не соответствует до/после этого.

Из документов:

(?!...)
Matches if ... doesn’t match next. This is a negative lookahead assertion. For example, Isaac (?!Asimov) will match 'Isaac ' only if it’s not followed by 'Asimov'.

(?<!...)
Matches if the current position in the string is not preceded by a match for .... This is called a negative lookbehind assertion. Similar to positive lookbehind assertions, the contained pattern must only match strings of some fixed length and shouldn’t contain group references. Patterns which start with negative lookbehind assertions may match at the beginning of the string being searched.