フラグを付けた Python re.sub では、すべての出現箇所が置き換えられるわけではありません

StackOverflow https://stackoverflow.com/questions/42581

  •  09-06-2019
  •  | 
  •  

質問

Python のドキュメントには次のように書かれています。

re.MULTILINE:指定すると、パターン文字 '^' は文字列の先頭と各行の先頭 (各改行の直後) で一致します。デフォルトでは、「^」は文字列の先頭でのみ一致します。

では、次のような予期しない結果が得られた場合は何が起こっているのでしょうか?

>>> import re
>>> s = """// The quick brown fox.
... // Jumped over the lazy dog."""
>>> re.sub('^//', '', s, re.MULTILINE)
' The quick brown fox.\n// Jumped over the lazy dog.'
役に立ちましたか?

解決

の定義を見てください re.sub:

sub(pattern, repl, string[, count])

4番目の引数はカウントであり、使用しています re.MULTILINE (8 です) フラグとしてではなく、カウントとして。

フラグを使用したい場合は、正規表現をコンパイルする必要があります。

re.sub(re.compile('^//', re.MULTILINE), '', s)

flags 引数は Python 2.7 で追加されたため、完全な定義は次のようになります。

re.sub(pattern, repl, string[, count, flags])

つまり、次のことを意味します。

re.sub('^//', '', s, flags=re.MULTILINE)

動作します。

他のヒント

re.sub('(?m)^//', '', s)

の完全な定義 re.sub は:

re.sub(pattern, repl, string[, count, flags])

つまり、Python にパラメータを伝えれば、次の値を渡すことができます。 flags 通り過ぎずに count:

re.sub('^//', '', s, flags=re.MULTILINE)

または、より簡潔に言うと:

re.sub('^//', '', s, flags=re.M)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top