正则表达式检测未引用的单词

Regex to detect words that are not quoted

提问人:Ibrahim 提问时间:8/15/2021 最后编辑:Ibrahim 更新时间:6/17/2022 访问量:201

问:

我有这个正则表达式,可以检测所有单词:

\b[^\d\W]+\b

我有这个正则表达式来检测引用的文本:

\'[^\".]*?\'|\"[^\'.]*?\"

有没有正则表达式可以检测不在引号中的单词(单引号和双引号)?

例:

import re
a = "big mouse eats cheese? \"non-detected string\" 'non-detected string too' hello guys"
re.findall(some_regex, a)

它应该输出这个['big', 'mouse', 'eats', 'cheese', 'hello', 'guys']

我知道我可以用来检测引用的文本,然后用空白字符串替换它,但这是我不想做的。re.sub()

我还查找了此页面正则表达式匹配不在引号中的关键字并尝试了此操作,但没有使用,用于检测未括在双引号中的字符串的正则表达式也尝试了此操作,两者都检测到了所有单词(^([^"]|"[^"]*")*)|(^([^']|'[^']*')*)(?<![\S"])([^"\s]+)(?![\S"])|(?<![\S'])([^'\s]+)(?![\S'])

Python 正则表达 式行情

评论


答:

1赞 Wiktor Stribiżew 8/15/2021 #1

你可以使用

import re
a = '''big mouse eats cheese? "non-detected string" 'non-detected string too' hello guys'''
print( [x for x in re.findall(r'''"[^"]*"|'[^']*'|\b([^\d\W]+)\b''', a) if x])
# => ['big', 'mouse', 'eats', 'cheese', 'hello', 'guys']

请参阅 Python 演示。列表推导式用于对输出进行后处理,以删除因匹配带引号的子字符串而产生的空项。

此方法有效,因为 re.findall 仅在正则表达式中定义捕获组时返回捕获的子字符串。 part 匹配但不捕获单引号和双引号之间的字符串,并且该部分匹配并捕获到组 1 中,将单词边界之间的任何一个或多个字母或下划线捕获到组 1 中。"[^"]*"|'[^']*'\b([^\d\W]+)\b

评论

0赞 Ibrahim 8/15/2021
那么,如果我尝试这样做,它会起作用吗?正如您所说,它之所以有效,是因为 re.findall() 的行为很奇怪re.compile().search()
0赞 Wiktor Stribiżew 8/15/2021
@Good 要仅获取第一个匹配项,请使用 ,但需要先检查是否有匹配项,然后再访问值。但是,使用此方法时,您需要用于获取所有匹配项,因为可能会产生空匹配项。因此,使用建议的方法获取所有匹配项,然后在必要时使用索引来获取第一个非空匹配项。re.searchmatch.group(1)re.findallre.search