Соответствие букв на любом языке

Как я могу сопоставить букву с любого языка, используя регулярное выражение в python 3?

re.match([a-zA-Z]) будет соответствовать символам английского языка, но я хочу, чтобы все языки поддерживались одновременно.

Я не хочу сопоставлять ' in can't или "подчеркивание" или любой другой тип форматирования. Я хочу, чтобы мое регулярное выражение соответствовало: c, a, n, t, Å, é и .

Ответ 1

Для работы регулярного выражения Unicode в Python я настоятельно рекомендую следующее:

  1. Используйте библиотеку regex Мэтью Барнетса вместо стандартного re, что не подходит для регулярных выражений Unicode.
  2. Используйте только Python 3, никогда Python 2. Вы хотите, чтобы все ваши строки были строками Unicode.
  3. Используйте только строковые литералы с логическими/абстрактными кодами Unicode, а не закодированными байтовыми строками.
  4. Установите свою кодировку в своих потоках и забудьте об этом. Если вы обнаружите, что когда-либо вручную .encode и т.д., Вы почти наверняка делаете что-то неправильно.
  5. Используйте только широкую сборку, где кодовые точки и кодовые единицы одинаковы, никогда не были узкими, что может показаться неприемлемым для устойчивости Unicode.
  6. Нормализовать все входящие строки в 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', 'ů', 'ň']