2017-08-08 5 views
2

私は困惑しています。私はIDEとしてPyCharmを使ってPython 3.6.2をコーディングしています。次のスクリプトフラグメントは私の問題を示していますPythonはre.findallとは異なる動作をします

def dosubst(m): 
    return m.group() + "X" 

line = r"set @message = formatmessage('%s %s', @arg1, @arg2);" 
m = re.findall(r"@\w+\b", line, re.IGNORECASE) 
print(m[0]) # prints "@message" 
print(m[1]) # prints "@arg1" 
print(m[2]) # prints "@arg2" 

foo = re.sub(r"@\w+\b", dosubst, line, re.IGNORECASE) 
print(foo) # prints "set @messageX = formatmessage('%s %s', @arg1X, @arg2);" 

あなたはre.findallは3試合を見つけることがわかります。ただし、re.subは、dosubst関数を2回だけと呼びます。 @messagemessageに変更した場合は、はまだdosubstを2回呼び出しますが、@arg1@arg2をピックアップします。うんざりする私はそれが貪欲対ポジティブかもしれないと思ったが、@messagemessageに変更すると、結果としてその動作は無効になる。誰でも説明できますか?私は、いくつかの基本的なテキスト解析を行い、多数のファイルのメッセージフォーマットをリファクタリングするようにしようとしています。私はregexr.comを使用して、私が行う正規表現の大部分のプロトタイプを作成します。また、パターン内にパターンが3回出現することもあります。ありがとう。

答えて

6

the documentationを参照してください。 re.subの第4引数は、flagsではなく、countです。 re.IGNORECASEは2になるので、2つの置換だけを実行するように指示しています。代わりに、キーワードによってflagsを渡す:

>>> re.sub(r"@\w+\b", dosubst, line, flags=re.IGNORECASE) 
"set @messageX = formatmessage('%s %s', @arg1X, @arg2X);" 
0

四番目の引数count=0を与えることによって。 0の代わりに他の正の数を入れた場合は、文字列をまったく同じ数の文字列に置き換えます。

foo = re.sub(r"@\w+\b", dosubst, line, 0, re.IGNORECASE) 
print(foo) 

出力:

"set @MessageX = formatmessage('%s %s', @arg1X, @arg2X);" 
関連する問題