【发布时间】:2022-01-06 18:18:10
【问题描述】:
给定一个字符串,如:
text = 'jack betty "donald jake rita" lorie katie danny'
还有一个关键字列表,例如:
keywords = ["jack", "donald", "rita", "katie"]
如何只返回在双引号中找到的关键字?
预期回报:
["donald", "rita"]
我做到了:
import re
import string
keywords = ["jack", "donald", "rita", "katie"]
text = 'jack betty "donald jake rita" lorie katie danny'
pattern_template = string.Template(r'(?:^[^"]*["][^"]*)($keywords)')
search_pattern = pattern_template.safe_substitute(keywords="|".join(keywords))
# This gives me a search_pattern of: (?:^[^"]*["][^"]*)(jack|donald|rita|katie)
matches = [match.group(1) for match in re.finditer(search_pattern, text)]
print(matches)
我的搜索模式从字符串的开头开始,跳过所有非引号字符,匹配一个引号,跳过 0 个或多个额外的非引号字符,然后查找其中一个关键字。
这仅返回:
['rita']
如果我从关键字中去掉“rita”,它只会返回:
['donald']
上面,我只使用match.group(1) 检查第一个捕获组,但如果我检查.groups() 以获取所有捕获组的元组,我仍然只能看到[('rita',)]
我认为问题在于重叠匹配。 有没有办法返回所有重叠的匹配项?
【问题讨论】:
-
分两步完成:首先获取双引号内的字符串,然后搜索关键字。
-
引号之间是否总是只有一个子字符串?此外,如果您对匹配 whole 单词不感兴趣,则不需要正则表达式。