1

我需要匹配以下输入集:

foo_abc_bar  
foo_bar

并得到“abc”或空字符串作为结果。

所以这是我写的正则表达式:

r'foo_(abc|)[_|]bar'

但由于某种原因,这与我给出的第二个字符串不匹配。

经过进一步检查,我发现它[_|]与空字符串不匹配。

那么,我该如何解决这个问题呢?

4

2 回答 2

5

要使其成为abc_可选,您可以使用问号运算符

(abc_)?

因此,整个正则表达式变为:

r'foo_(abc_)?bar'

使用此正则表达式,第二个下划线(如果存在)将成为捕获组的一部分。如果您不希望这样,您可以在匹配后删除它.rstrip('_')或使用稍微复杂的正则表达式:

r'foo_(?:(abc)_)?bar'

我发现它[_|]与空字符串不匹配。

这是正确的。方括号表示一个字符组。将[_|]完全匹配一个下划线或一个垂直条,仅此而已。换句话说,当竖线出现在字符组中时,它就失去了它的特殊含义。

于 2012-11-24T07:45:16.470 回答
1

如果你想要这样的字符串模式

xxx_xxx_xxx
xxx_xxx

那么你需要

([A-Za-z]{3})((_[A-Za-z]{3})+)?

但这也可以

r'foo(_abc)?_bar'

?表示可选(可能匹配也可能不匹配)。

于 2012-11-24T07:44:55.027 回答