2

这不会给我错误或答案。

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

为什么它会这样?此外,如果我减少“周期”的数量,那么它就可以工作。

谢谢你。

4

2 回答 2

8

你有灾难性的回溯

于 2012-08-18T01:39:03.463 回答
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

更新:您的正则表达式正遭受灾难性的回溯;避免在带有通配符的组中使用嵌套的字符类或字符集组合(上面列出的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

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

于 2012-08-18T01:12:43.073 回答