python - 使用 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']
谢谢
解决方案
你应该:
- 转义替代品,以便
.
可以匹配一个点(即使用'|'.join(map(re.escape,all_domain))
) - 使用明确的单词边界 left-hand
(?<!\w)
和 right-hand(?!\w)
,因为\b
含义取决于上下文,请参阅 正则表达式单词边界和特殊字符和正则表达式以匹配以特殊字符开头的单词边界,还有很多这样的问题。
采用
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']
推荐阅读
- node.js - 向 Keycloak 请求获取 jwt 发送 autorizathion 代码时出错
- python-3.x - 找不到名为 Snowflake 的模块
- ruby-on-rails - 优化问题,显示给定选择集合的剩余选项的最大数量
- html - 沿 Z 方向倾斜 HTML 元素
- javascript - 添加对触摸事件的支持
- html - 在 Flask 中为每个 HTML 表保存一个
- c# - 动态 ListView 不会更新 ViewModel 中的 OnPropertyChange
- javascript - 即使选择并定义了文本,jS复制功能也不起作用?
- python - python 正则表达式 re.match
- python - Python中的SQL更新命令找不到列并且数据库被锁定