Python 2.7 Реализация токенов в Regex не работает
Я создал регулярное выражение для сопоставления токенов на немецком text
который имеет тип string
,
Мое регулярное выражение работает, как и ожидалось, используя https://regex101.com/. Вот ссылка на мое регулярное выражение с примером предложения: Мой регулярное выражение + пример на regex101.com
Поэтому я реализовал это в python 2.7
как это:
GERMAN_TOKENIZER = r'''(?x) # set flag to allow verbose regex
([A-ZÄÖÜ]\.)+ # abbrevations including ÄÖÜ
|\d+([.,]\d+)?([€$%])? # numbers, allowing commas as seperators and € as currency
|[\wäöü]+ # matches normal words
|\.\.\. # ellipsis
|[][.,;\"'?():-_'!] # matches special characters including !
'''
def tokenize_german_text(text):
'''
Takes a text of type string and
tokenizes the text
'''
matchObject = re.findall(GERMAN_TOKENIZER, text)
pass
tokenize_german_text(u'Das ist ein Deutscher Text! Er enthält auch Währungen, 10€')
Результат:
Когда я отлаживал это, я обнаружил, что matchObject
это только список, содержащий 11 записей с пустыми символами. Почему это не работает, как ожидалось, и как я могу это исправить?
1 ответ
re.findall()
собирает только совпадения в группах захвата (если в вашем регулярном выражении нет групп захвата, и в этом случае он фиксирует каждое совпадение).
Таким образом, ваше регулярное выражение совпадает несколько раз, но каждый раз, когда совпадает ни одна группа захвата. Удалите группы захвата, и вы увидите результаты. Кроме того, поместите -
в конце класса символов, если вы на самом деле не хотите соответствовать диапазон символов между :
а также _
(но не -
сам):
GERMAN_TOKENIZER = r'''(?x) # set flag to allow verbose regex
(?:[A-ZÄÖÜ]\.)+ # abbrevations including ÄÖÜ
|\d+(?:[.,]\d+)?[€$%]? # numbers, allowing commas as seperators and € as currency
|[\wäöü]+ # matches normal words
|\.\.\. # ellipsis
|[][.,;\"'?():_'!-] # matches special characters including !
'''
Результат:
['Das', 'ist', 'ein', 'Deutscher', 'Text', '!', 'Er', 'enthält', 'auch', 'Währungen', ',', '10€']