我需要匹配以下输入集:
foo_abc_bar
foo_bar
并得到“abc”或空字符串作为结果。
所以这是我写的正则表达式:
r'foo_(abc|)[_|]bar'
但由于某种原因,这与我给出的第二个字符串不匹配。
经过进一步检查,我发现它[_|]
与空字符串不匹配。
那么,我该如何解决这个问题呢?
要使其成为abc_
可选,您可以使用问号运算符:
(abc_)?
因此,整个正则表达式变为:
r'foo_(abc_)?bar'
使用此正则表达式,第二个下划线(如果存在)将成为捕获组的一部分。如果您不希望这样,您可以在匹配后删除它.rstrip('_')
或使用稍微复杂的正则表达式:
r'foo_(?:(abc)_)?bar'
我发现它
[_|]
与空字符串不匹配。
这是正确的。方括号表示一个字符组。将[_|]
完全匹配一个下划线或一个垂直条,仅此而已。换句话说,当竖线出现在字符组中时,它就失去了它的特殊含义。
如果你想要这样的字符串模式
xxx_xxx_xxx
xxx_xxx
那么你需要
([A-Za-z]{3})((_[A-Za-z]{3})+)?
但这也可以
r'foo(_abc)?_bar'
?
表示可选(可能匹配也可能不匹配)。