正则表达式匹配单独或被下划线包围的单词

Regex match words that are by their own or surrounded by underscores

我正在尝试匹配单词 int,它可以单独匹配,也可以由下划线 (_) 包围。

int  # match
_int_  # match
__int__  # match
some_int  # match
int_var  # match
integration  # doesn't match
mint  # doesn't match

这是我一直在尝试的,但它只符合上面的第二种情况

pattern = re.compile(r"(?<=[\W_])int(?=[\W_])")

我应该怎么做? 谢谢大家

在这种情况下你需要使用双重否定逻辑:

(?<![^\W_])int(?![^\W_])

参见regex demo

(?<![^\W_]) 后视匹配一个位置,该位置前面没有任何字符,非单词和 _ 字符除外。这意味着,必须有字符串位置的开头或紧靠左侧 _ 以外的任何非单词字符。

(?![^\W_]) 前瞻匹配一个位置,该位置后面没有紧跟非单词和 _ 字符以外的任何字符。这意味着,必须有一个字符串结束位置或除 _ 之外的任何非单词字符紧靠右侧。

你的正则表达式中,你使用的 (?<=[\W_]) 正后视 需要 一个非词或 _紧靠左边并且 (?=[\W_]) 正向前瞻需要紧靠右边的非单词或下划线字符。因此,这些环视不允许在字符串的开头或结尾进行匹配

注意:当你使用 Python re 时,你不能简单地添加一个 ^| 替代你的回顾,因为 Python re does not allow 具有非固定宽度模式的后视。 (?<=[\W_]|^)int(?=[\W_]|$) 适用于 PHP/PCRE、Java、Ruby/Onigmo,但不适用于 Python re。这就是为什么双重否定方式是这里唯一的方式。