Соответствие букв на любом языке
Как я могу сопоставить букву с любого языка, используя регулярное выражение в python 3?
re.match([a-zA-Z])
будет соответствовать символам английского языка, но я хочу, чтобы все языки поддерживались одновременно.
Я не хочу сопоставлять '
in can't
или "подчеркивание" или любой другой тип форматирования. Я хочу, чтобы мое регулярное выражение соответствовало: c
, a
, n
, t
, Å
, é
и 中
.
Ответы
Ответ 1
Для работы регулярного выражения Unicode в Python я настоятельно рекомендую следующее:
- Используйте библиотеку
regex
Мэтью Барнетса вместо стандартного re
, что не подходит для регулярных выражений Unicode. - Используйте только Python 3, никогда Python 2. Вы хотите, чтобы все ваши строки были строками Unicode.
- Используйте только строковые литералы с логическими/абстрактными кодами Unicode, а не закодированными байтовыми строками.
- Установите свою кодировку в своих потоках и забудьте об этом. Если вы обнаружите, что когда-либо вручную
.encode
и т.д., Вы почти наверняка делаете что-то неправильно. - Используйте только широкую сборку, где кодовые точки и кодовые единицы одинаковы, никогда не были узкими, что может показаться неприемлемым для устойчивости Unicode.
- Нормализовать все входящие строки в NFD на пути, а затем NFC на выходе. В противном случае вы не сможете получить надежное поведение.
Как только вы сделаете это, вы можете безопасно писать шаблоны, которые включают в себя \w
или \p{script=Latin}
или \p{alpha}
и \p{lower}
т.д. И знаете, что все они будут делать то, что говорит Unicode Standard. В этом ответе я расскажу о всех этих делах бизнеса Python Unicode regex гораздо подробнее. Короткий рассказ - всегда использовать regex
not re
.
Для общего совета Unicode у меня также есть несколько разговоров с последним OSCON о регулярных выражениях Unicode, большинство из которых, кроме 3-го разговора, касаются не только Python, но и многие из них адаптируются.
Наконец, theres всегда этот ответ поставить страх перед Богом (или, по крайней мере, Unicode) в вашем сердце.
Ответ 2
Что случилось с использованием специальной последовательности \w?
# -*- coding: utf-8 -*-
import re
test = u"can't, Å, é, and 中ABC"
print re.findall('\w+', test, re.UNICODE)
Ответ 3
Вы можете
\p{L}
который соответствует любой кодовой точке Unicode, которая представляет букву скрипта. То есть, предполагая, что у вас действительно есть механизм регулярных выражений, совместимый с Unicode, который я действительно надеюсь на Python.
Ответ 4
Создайте класс соответствия всех символов, которые вы хотите сопоставить. Это может стать очень, очень большим. Нет, нет указаний RegEx для "Все кандзи";)
Может быть, легче сопоставить то, чего вы не хотите, но даже тогда этот класс станет чрезвычайно большим.
Ответ 5
import re
text = "can't, Å, é, and 中ABC"
print(re.findall('\w+', text))
Это работает в Python 3. Но это также соответствует символам подчеркивания. Однако это похоже на то, что я хочу:
import regex
text = "can't, Å, é, and 中ABC _ sh_t"
print(regex.findall('\p{alpha}+', text))
Ответ 6
Для португальского языка используйте этот вариант:
[a-zA-ZÀ-ú ]+
Ответ 7
Как отмечают другие, было бы очень сложно сохранить обновленную базу данных всех писем на всех существующих языках. Но в большинстве случаев вам это действительно не нужно, и для вашего кода может быть совершенно нормально, если вы начнете с поддержки нескольких выбранных языков и добавления других по мере необходимости.
Следующий простой код поддерживает сопоставление для чешского, немецкого и польского языков. Наборы символов можно легко получить из Википедии.
import re
LANGS = [
'ÁáČčĎďÉéĚěÍíŇňÓóŘřŠšŤťÚúŮůÝýŽž', # Czech
'ÄäÖöÜüẞß', # German
'ĄąĆćĘꣳŃńÓóŚśŹźŻż', # Polish
]
pattern = '[A-Za-z{langs}]'.format(langs=''.join(LANGS))
pattern = re.compile(pattern)
result = pattern.findall('Žluťoučký kůň')
print(result)
# ['Ž', 'l', 'u', 'ť', 'o', 'u', 'č', 'k', 'ý', 'k', 'ů', 'ň']