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

Squ*_*art 2 python regex substitution

这不会给我一个错误或答案.

re.sub('\\.(\\W|\\.)*[o0](\\W|[o0])*', '*', '..........................................')  
Run Code Online (Sandbox Code Playgroud)

为什么它会这样?此外,如果我减少'期间'的数量,那么它的工作原理.

谢谢.

Mar*_*ers 5

您的输入字符串中没有o或没有0,但您的正则表达式要求其中至少有一个字符([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
Run Code Online (Sandbox Code Playgroud)

更新:你的正则表达遭受灾难性的回溯 ; 避免使用通配符的组中的嵌套字符类或字符集组合(上面列出的branch .. or部分max_repeat).您可以将字符类放在字符集中以避免这种情况.

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

以下作品:

re.sub(r'\.[\W\.]*[o0][\Wo0]*', '*', '..........................................')
Run Code Online (Sandbox Code Playgroud)

因为它编译为:

>>> 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
Run Code Online (Sandbox Code Playgroud)

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