Python正则表达式:为什么这不起作用?

时间:2012-08-18 01:11:05

标签: python regex substitution

这不会给我错误或答案。

re.sub('\\.(\\W|\\.)*[o0](\\W|[o0])*', '*', '..........................................')  

为什么会这样?另外,如果我减少'句号'的数量,那么它就可以了。

谢谢。

2 个答案:

答案 0 :(得分:8)

答案 1 :(得分:5)

您的输入字符串中没有o0,但您的正则表达式要求其中至少有一个字符([o0])。

>>> re.compile('\\.(\\W|\\.)*[o0](\\W|[o0])*', re.DEBUG)
literal 46
max_repeat 0 65535
  subpattern 1
    branch
      in
        category category_not_word
    or
      literal 46
in
  literal 111
  literal 48
max_repeat 0 65535
  subpattern 2
    branch
      in
        category category_not_word
    or
      in
        literal 111
        literal 48

更新:你的正则表达式受到catastrophic backtracking的影响;避免使用通配符的组中的嵌套字符类或字符集组合(上面列出的branch .. or内的max_repeat部分)。您可以将字符类放在字符集中以避免这种情况。

另请注意,您可以使用r''原始字符串表示法来避免所有转义的反斜杠。

以下作品:

re.sub(r'\.[\W\.]*[o0][\Wo0]*', '*', '..........................................')

因为它编译为:

>>> re.compile(r'\.[\W\.]*[o0][\Wo0]*', re.DEBUG)
literal 46
max_repeat 0 65535
  in
    category category_not_word
    literal 46
in
  literal 111
  literal 48
max_repeat 0 65535
  in
    category category_not_word
    literal 111
    literal 48

请注意,现在分支已经消失。