下面列出了两个关键字的列表:
keywords = ["Azure", "Azure cloud"]但是python找不到第二个关键字"Azure cloud“
>>> keywords = ["Azure", "Azure cloud"]
>>> r = re.compile('|'.join([re.escape(w) for w in keywords]), flags=re.I)
>>> word = "Azure and Azure cloud"
>>> r.findall(word)
['Azure', 'Azure']我期待这样的输出:'Azure','Azure','Azure cloud‘
任何指南/帮助都将不胜感激!
发布于 2020-03-03 06:49:30
你可以进行多次搜索。
import itertools
import re
keywords = ["Azure", "Azure cloud"]
patterns = [re.compile(re.escape(w), flags=re.I) for w in keywords]
word = "Azure and Azure cloud"
results = list(itertools.chain.from_iterable(
r.findall(word) for r in patterns
))
print(results)产出:
['Azure', 'Azure', 'Azure cloud']追加
如果我有单词= "Azure and azure cloud“--我的输出是'Azure','azure','azure‘--那么第二个关键字"Azure”是小的,如果我必须得到与"azure“这个”关键字“列表完全匹配的单词,那么代码中需要做什么修改?
标志re.I的意思是忽略大小写.所以把这个去掉就行了。
patterns = [re.compile(re.escape(w)) for w in keywords]附录2
很抱歉,我上次的评论很模糊,所以我希望模式匹配忽略这个情况,但是在获取输出时,我希望关键字具有与“关键字”列表中的完全相同的情况,而不是在"word“中。
抱歉误会了。试试这个:
import re
keywords = ["Azure", "azure cloud"]
patterns = [re.compile(w, flags=re.I) for w in keywords]
word = "Azure and azure cloud"
results = [
match_obj.re.pattern
for r in patterns
for match_obj in r.finditer(word)
]
print(results)产出:
['Azure', 'Azure', 'azure cloud']我不确定这是一种有效的方式,但它有效。
请注意,我删除了re.escape,因为它会导致空间转义,因此结果是:
['Azure', 'Azure', 'azure\\ cloud']发布于 2020-03-03 07:00:31
findall找到所有不重叠的匹配。在交替的情况下,它会尝试从左到右的各种情况。
所以这里发生的是regex引擎到达Azure cloud,设法匹配Azure和.开始在cloud中再次查找它,因为它能够将Azure与某些东西匹配。
如果您期望"Azure和Azure cloud“生成"Azure”、"Azure“和"Azure Cloud”,则需要单独运行每个模式,而不是一个单独的交替模式。
https://stackoverflow.com/questions/60501452
复制相似问题