首页 > 解决方案 > 使用 findall 的交流发电机中的字符串与正确的字符串不匹配

问题描述

我使用 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']

谢谢

标签: pythonregexfindall

解决方案


你应该:

采用

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 演示


推荐阅读