正则表达式,而非声明

时间:2015-08-23 17:11:32

标签: python regex regex-negation negation

Heyho,

我有正则表达式

([ ;(\{\}),\[\'\"]?)(_[a-zA-Z_\-0-9]*)([ =;\/*\-+\]\"\'\}\{,]?)

匹配每次出现的

_var

问题是它还匹配像

这样的字符串
test_var

我尝试添加一个新的匹配组,否定任何单词字符,但它没有正常工作。

有人能弄清楚我要做些什么来不匹配像var_var这样的字符串吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您可以使用以下“修复”:

([[ ;(){},'"]?)(\b_[a-zA-Z_0-9-]*\b)([] =;/*+"'{},-]?)
                ^                 ^

请参阅regex demo

单词边界\b是一个锚点,用于断言单词和非单词边界之间的位置。这意味着如果前面带有字母,数字或a,则_var永远不会匹配。此外,我删除了可选捕获组中的字符类中的过度转换。请注意,对于Python正则表达式而言,连字符和方括号的所谓“智能放置”可能并不重要,但仍然是编写正则表达式的最佳实践。此外,在Python正则表达式中,您不需要转义/,因为那里没有正则表达式分隔符。

还有一个提示:没有u修饰符,\w匹配[a-zA-Z0-9_],所以你可以将正则表达式写为

([[ ;(){},'"]?)(\b_[\w-]*\b)([] =;/*+"'{},-]?)

请参阅regex demo 2

IDEONE demo(注意使用r'...'):

import re
p = re.compile(r'([[ ;(){},\'"]?)(\b_[\w-]*\b)([] =;/*+"\'{},-]?)')
test_str = "Some text _var and  test_var"
print (re.findall(p, test_str))