2016-06-13 13 views
1

変数に複数行の文字列があり、私はtest v1.0upsideに置き換えようとしていますが、問題は全行それは私がre.subを使用して交換するパターンとして'\^test v1.0\$'を入れてみました最初test v1.0.1Python - 文字列変数の正規表現部分文字列を検索して置き換えます

pkgLogExtract = dedent(""" 
         test v1.0.1 
         nothing 

         test v1.0 
         out 
         in 
         flip 
         """) 

print (re.sub(r'\^test v1.0\$', "upside", pkgLogExtract, 1)) 

を置き換えるべきではありませんが、それは何を置き換えるものではありませんので、パターンに一致します。私もrawフラグで試してみました。だからr'\^test v1.0\$'でも、何も置き換えません。私が何をすることができるか考えてみませんか?

+2

'\ ^'はリテラル '^'と一致します。同じことが '$'についてです。あなたは 're.sub'に' flags = re.M'を渡し、 '^'と '$'からバックスラッシュを削除する必要があります。そして、 '.'を脱出する。 http://ideone.com/ijPIraを参照してください。 –

+0

'your_string.replace(" test v1.0 \ n "、" upside ")は脆すぎますか? – jDo

+0

@jDoすべての状況で 'replace'が動作することを100%保証することができなかったので、正規表現を選択しました(上記のスクリプトは疑似コードです)。 – TheGirrafish

答えて

3

\^は、リテラル^と一致します。同じ約$になります。 flags=re.Mre.subに渡し、バックスラッシュを^$から削除して、それぞれ開始行と終了行に一致させる必要があります。そして、.から脱出する。

このIDEONE demo参照してください:

import re 
pkgLogExtract = """ 
test v1.0.1 
nothing 
test v1.0 
out 
in 
flip 
""" 

print (re.sub(r'^test v1\.0$', "ngn", pkgLogExtract, 1, flags=re.M)) 

注:私はあなたが1は(最初の一致が置き換えられてしまいます)単一の置換を意味することを知っていると思います。

注2:あなたはflags=を省略しre.Mを使用していますが、多くの人が上記を使用することを忘れてはcount引数を述べたので、ここでは引数名を維持するのが最善です。

+0

ありがとうそれは素晴らしい作品!バックスラッシュなしで試してみましたが、うまくいきませんでした。問題は私がre.Mフラグを全部欠落していたことだと思います。 – TheGirrafish

+1

可能です。また、 'test v1-0'のようなテキストではなく、リテラルドットと一致するようにドットをエスケープする必要があります –

関連する問題