Строка не соответствует правильной строке в генераторах с использованием findall - PullRequest
3 голосов
/ 11 марта 2020

Я использовал re.findall для токенизации строк, которые не всегда должны разделяться после слова (токен может иметь составные слова). Я получил токены описанным способом. Тем не менее, он не хранит точки, включенные в шаблон регулярного выражения.

Например, рассмотрим следующий код:

import re
all_domain=['com edu','.com edu','inc.', '.com', 'inc', 'com', '.edu', 'edu']
all_domain.sort(key=len, reverse=True)
domain_alternators = '|'.join(all_domain)

print(domain_alternators)
regex = re.compile(r'\b({}|[a-z-A-Z]+)\b'.format(domain_alternators))
print(regex)
#re.compile('\\b(.com edu|com edu|inc.|.com|.edu|inc|com|edu|[a-z-A-Z]+)\\b')

name= 'BASIC SCHOOL DISTRICT .COM'
result=regex.findall(name.lower())

он должен вернуть в результате ['basic', 'school', 'district', '.com'], поскольку .com имеет более высокий приоритет в генераторах (.com предшествует com в списках генераторов):

.com edu|com edu|inc.|.com|.edu|inc|com|edu

Как получить ['basic', 'school', 'district', '.com'] вместо ['basic', 'school', 'district', 'com']

Спасибо

1 Ответ

1 голос
/ 11 марта 2020

Вы должны:

Использование

import re
all_domain=['com edu','.com edu','inc.', '.com', 'inc', 'com', '.edu', 'edu']
all_domain.sort(key=len, reverse=True)
domain_alternators = '|'.join(map(re.escape,all_domain)) # <-- HERE
regex = re.compile(r'(?<!\w)({}|[a-z-A-Z]+)(?!\w)'.format(domain_alternators))  # <-- HERE

name= 'BASIC SCHOOL DISTRICT .COM'
result=regex.findall(name.lower())
print(result) # => ['basic', 'school', 'district', '.com']

См. Python демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...