2

これは私にエラーも答えも与えません。

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

なぜそのように振る舞うのですか?また、「ピリオド」の量を減らすと、機能します。

ありがとうございました。

4

2 に答える 2

5

o入力文字列にorがありませ0んが、正規表現にはこれらの文字の少なくとも 1 つが必要です ( [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の a 内の部分) で使用しないでください。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 に答える