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

Regex to detect words that are not quoted

我有这个检测所有单词的正则表达式:

\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() 来检测引用的文本,然后用空白字符串替换它,但我不想这样做。

我也查了这个页面regex match keywords that are not in quotes and tried this (^([^"]|"[^"]*")*)|(^([^']|'[^']*')*) but it didn't work A regex to detect string not enclosed in double quotes也试过这个(?<![\S"])([^"\s]+)(?![\S"])|(?<![\S'])([^'\s]+)(?![\S'])都检测到所有单词

您可以使用

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 demo。列表理解用于 post 处理输出以删除匹配引用子字符串所产生的空项。

这种方法之所以有效,是因为 在正则表达式中定义了捕获组。 "[^"]*"|'[^']*' 部分匹配但不捕获单引号和双引号之间的字符串,\b([^\d\W]+)\b 部分匹配单词边界之间的任何一个或多个字母或下划线并将其捕获到组 1 中。