Совпадение букв на любом языке - PullRequest
14 голосов
/ 26 августа 2011

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

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

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

Ответы [ 7 ]

19 голосов
/ 26 августа 2011

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

  1. Использование библиотеки regex Мэтью Барнетта вместо стандартного re, что не совсем подходит для регулярных выражений Юникода.
  2. Используйте только Python 3, но не Python 2. Вы хотите, чтобы все ваши строки были строками Unicode.
  3. Используйте только строковые литералы с логическими / абстрактными кодовыми точками Юникода, не закодированные байтовые строки.
  4. Установите кодировку в своих потоках и забудьте об этом. Если вы обнаружите, что когда-либо вручную звоните .encode и тому подобное, вы почти наверняка делаете что-то не так.
  5. Используйте только широкую сборку, в которой кодовые точки и единицы кода одинаковы, никогда не используйте узкие, что вы могли бы сделать лучше, если бы считалось устаревшим из-за надежности Unicode.
  6. При входе нормализуйте все входящие строки в NFD, а затем NFC. В противном случае вы не сможете получить надежное поведение.

Как только вы это сделаете, вы можете безопасно написать шаблоны, которые включают \w или \p{script=Latin} или \p{alpha} и \p{lower} и т. Д. И знают, что все они будут делать то, что Стандарт Unicode говорит, что они должны . Я объясняю все это дело с регулярным выражением Python Unicode в этом ответе . Короткая история - всегда использовать regex, а не re.

Для общих советов по Unicode у меня также есть несколько сообщений из прошлого OSCON о регулярных выражениях Unicode, большинство из которых, кроме третьего разговора, не о Python, но большая часть из них является адаптируемой.

Наконец, всегда есть этот ответ , чтобы вселить страх Божий (или, по крайней мере, Unicode) в ваше сердце.

7 голосов
/ 26 августа 2011

Что не так с использованием специальной последовательности \ w?

# -*- coding: utf-8 -*-
import re
test = u"can't, Å, é, and 中ABC"
print re.findall('\w+', test, re.UNICODE)
4 голосов
/ 26 августа 2011

Вы можете соответствовать на

\p{L}

, который соответствует любой кодовой точке Unicode, представляющей букву скрипта. То есть, если у вас действительно есть движок регулярных выражений с поддержкой Unicode, который, я очень надеюсь, будет у Python.

1 голос
/ 26 августа 2011
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))
1 голос
/ 26 августа 2011

Создайте класс соответствия из всех символов, которых вы хотите сопоставить. Это может стать очень , очень большим. Нет, для "All Kanji" не существует сокращений RegEx;)

Возможно, легче найти то, чего вы не хотите, но даже тогда этот класс станет чрезвычайно большим.

0 голосов
/ 06 апреля 2018

Как отметили другие, было бы очень трудно поддерживать актуальную базу данных всех писем на всех существующих языках.Но в большинстве случаев вам это на самом деле не нужно, и ваш код может начать с поддержки нескольких выбранных языков и добавления других по мере необходимости.

Следующий простой код поддерживает сопоставление для Чешский , Немецкий и Польский язык.Наборы символов можно легко получить из Википедии.

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', 'ů', 'ň']
0 голосов
/ 28 февраля 2017

Для португальского языка используйте попробуйте это:

[a-zA-ZÀ-ú ]+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...