Python文字列は文字を正規表現に置き換えます[重複]

Nov 27 2020

理解できない正規表現の問題が発生しました。文字列間のコンマをセミコロンに置き換えようとしていますが、機能しません。以下にサンプル文字列を示します。正規表現の非キャプチャグループの「シーケンス」の後のコンテンツ以外のすべてを置き換えるように正規表現を設定しました。そのため、末尾のコンマは、非キャプチャグループの唯一の部分文字列であるセミコロンに置き換える必要があります。しかし、それは機能しません。(?:sequence :)を非キャプチャグループとして配置した場合にのみ、文字列のいずれかが保持されるようです。\ dを追加するとすぐに、すべてが置き換えられます。理由はわかりません。

私の本当の問題では、コロンでマークされ、セミコロンで終わる深刻なコンテンツタグがあります。タグシーケンスに、セミコロンの代わりに誤ったコンマがあります。これを置き換える必要がありますが、すべてを変更しないでください。したがって、ソリューションはsequence:2をsequence:2に変更する必要があります。

a_string = "tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2, tag4: content4"
new_string = re.sub(r"(?:sequence\:)(?:\d)(\,)", ";", a_string)

new_string

私はうまくいくはずの他の解決策を見ましたが、これはしません。どんな助けでもありがたいです、そして私がこの質問をもっと明確にすることができるかどうか私に知らせてください。

回答

1 TimBiegeleisen Nov 27 2020 at 06:17

あなたはおそらくここでポジティブネガティブルックビハインドを使用するつもりでした:

a_string = "tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2, tag4: content4"
new_string = re.sub(r"(?<=\bsequence:\d)(\,)", ";", a_string)

print(new_string)

これは印刷します:

tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2; tag4: content4

ちなみに、sequenceターゲットのカンマの前のテキストを直接一致させたい場合は問題ありませんが、キャプチャグループを使用してテキストを置き換えることもできます。

a_string = "tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2, tag4: content4"
new_string = re.sub(r"(sequence:\d)(\,)", "\\1;", a_string)
print(new_string)   # same as above