Python中用于单词排除的正则表达式

3

我有一个正则表达式'[\w_-]+',它允许字母数字字符或下划线。

我有一个 Python 列表中的单词集合,我不想让它们被匹配。

listIgnore = ['summary', 'config']

正则表达式需要做哪些改变?

P.S:我对正则表达式很新。


1
可能是重复的 https://dev59.com/4nRC5IYBdhLWcg3wG9To - korylprince
同意这是一个重复的问题。 - justhalf
2个回答

3
>>> line="This is a line containing a summary of config changes"
>>> listIgnore = ['summary', 'config']
>>> patterns = "|".join(listIgnore)
>>> print re.findall(r'\b(?!(?:' + patterns + r'))[\w_-]+', line)
['This', 'is', 'a', 'line', 'containing', 'a', 'of', 'changes']

2
这个问题让我感到好奇,因此我开始寻找答案:
'^(?!summary)(?!config)[\w_-]+$'

现在这仅适用于您想要将正则表达式与完整字符串匹配的情况:
>>> re.match('^(?!summary)(?!config)[\w_-]+$','config_test')
>>> (None)
>>> re.match('^(?!summary)(?!config)[\w_-]+$','confi_test')
>>> <_sre.SRE_Match object at 0x21d34a8>

因此,要使用您的列表,只需在正则表达式中的^后添加更多的(?!<word here>)。这些被称为前瞻断言。这里有一些好的信息。

如果您正在尝试在字符串内进行匹配(即没有^$),那么我不确定是否可能。例如,正则表达式将仅选择不匹配的子集字符串。例如:ummary用于summary

显然,您选择的排除越多,效率就会越低。可能有更好的方法来实现它。


可能,过滤所有找到的值 - 就像thefourtheye的答案一样 - 将更加有效(re可能是一个内存紧缩的麻烦)。 - volcano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接