2017-11-06 33 views
0

文字列のPython:文字列&リストre.sub比較

txt = "this is a red house" 

が存在するようになってきました。そしてリストがあります。

patterns = ["thi", "a r", "use"] 

があります。

計画は私がTHI^sと戻ることを望んだa = re.sub("".join(patterns), "".join(patterns) + "^", txt)、R ^編ハウス^があるを使用することでした。それほど多くではなく、という文字列をにもう一度印刷します。 re.searchが代わりに使用されている場合、実際にはNoneが返されるため、re.subは文字列を返すだけで何も見つかりません。

私はre.subはちょうど私はそれができると思っていた方法を使用することができない、そして私が誤って単純なループ内でそれを試みたことを考えて、この上のプラグを引っ張って準備ができていた:

for i in patterns: 
    a = re.sub(i, i + "^", txt) 
    print(a) 

と、突然それは(ほとんど)働いた:THI^sが赤い家 [\ nを] あるこのAR ^編ハウス [\ n]はこれは赤い家^です。今私はそれを放棄することはできません。何が起こっている?

+0

あなたの質問は何ですか? –

+0

私は最初に、正規表現を動的に構築する前に、正規表現がどのように見えるべきかを考え出すことから始めます。構築された正規表現が何にもマッチしないので、 're.sub'へのあなたの呼び出しは元の入力を生成するので、何も置き換えられません。 – Blender

+0

あなたはそれが私が思ったことだと分かります。そしてそれはループ内で一致しました。構築された正規表現が何にもマッチしない場合、なぜそこで動作しますか? –

答えて

2

あなたはtxtaを交換する場合あなたのループを完全に固定することができます。

for i in patterns: 
    txt = re.sub(i, i + "^", txt) 
    print(txt) 

そのように、あなたは実際に代わり、元のテキスト上の各置換を実行し、結果を廃棄するインクリメンタルテキストを変更します。

this is a red house 
thi^s is a red house 
thi^s is a r^ed house 
thi^s is a r^ed house^ 

あなたが本当にre.sub()で正規表現を使用していないので、それはより簡単になるだろうただstr.replaceを使用します。

for pattern in patterns: 
    txt = txt.replace(pattern, pattern + '^') 

あなたが実際に正規表現を使用したい場合、あなたはこのような何かをする必要があると思います:

patterns_regex = '(' + '|'.join(patterns) + ')' # ['a', 'b'] -> '(a|b)' 
print(re.sub(patterns_regex, r'\1^', txt) 
1

、その後、|と一緒にあなたのパターンに参加しre.sub()の交換引数として関数を使用する:

regex = re.compile("|".join([f"({p})" for p in patterns])) 
regex.sub(lambda m: m.string[m.start():m.end()]+"^", txt) 

# 'thi^s is a r^ed house^' 

注:re.compile()を使用したくない場合は、1行でそれをすべて行うことができます:

re.sub("|".join([f"({p})" for p in patterns]), 
     lambda m: m.string[m.start():m.end()]+"^", 
     txt) 
1

forループの繰り返しごとに置換を保存していません。置換された値をtxtに再割り当てしてみてください。

import re 

txt = "this is a red house" 
patterns = ["thi", "a r", "use"] 

for i in patterns: 
    txt = re.sub(i, i + "^", txt) 
print(txt) 
# prints: 
thi^s is a r^ed house^ 
2

これはあなたが探している結果得られます。

txt = "this is a red house" 
patterns = ["thi", "a r", "use"] 

for s in patterns: 
    txt = re.sub(s,s+'^',txt) 
print(txt) 

まず、あなたのprintステートメントはループ内にあります。したがって、重複する文字列です。それぞれがループを通過するため

第二に、あなたのre.sub(...)'TXT'に変更を返しています。 に変更したい場合は、結果を'txt'に戻す必要があります。そうでない場合は、'a'に割り当てられた最新の置換のみが表示されます。

第三に、"" .join(パターン)ストリング結果 "'TXT'のどの部分と一致しないであろうチア策略"

こちらがお役に立てば幸いです。正規表現はそれ自体で規律です。私は80年代から使用してきたが、依然として文書をチェックする必要がある。立ち止まるな!