正则表达式匹配单独或被下划线包围的单词
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
。这就是为什么双重否定方式是这里唯一的方式。
我正在尝试匹配单词 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
。这就是为什么双重否定方式是这里唯一的方式。