質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1130閲覧

pythonでのre.subでの文字置換がうまくいかないことがある

pariparigorilla

総合スコア14

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/09/13 04:53

前提・実現したいこと

re.subで正規表現でマッチさせて文字置換をするコードを書きました。

line1 = "aaa"
line2 = "bbb ccc=ddd,eee"

こういったときに、line2のddd部分を、aaaに変換するコードです。
上記の場合、期待通りに、「bbb ccc=ddd,eee」となりました
しかし、line1が"21aaa"など数値から始まるとき、
「bbbQaaa,eee」となりました。
期待としては、数値から始まっていても、
「bbb ccc=21aaa,eee」となってほしいです。

発生している問題・エラーメッセージ

bbbQaaa,eee

該当のソースコード

python

1line1 = "21aaa" 2line2 = "bbb ccc=ddd,eee" 3line3 = re.sub(r"((^ccc|[ ,\t]ccc)[ \t]*=)[ \t]*.*?([, \n\t])", r"\1" + line1 + r"\3", line2, flags=re.IGNORECASE) 4print(line3)

試したこと

数値を21から数を増やして変えて見たところ、アルファベット順に変化していきました。(文字コードか何か?)
正規表現の=が怪しいのかと思って調べてみたのですが、原因がわかりませんでした。

補足情報(FW/ツールのバージョンなど)

reのversion 2.2.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

すごく複雑な正規表現を記述しているようですが、まずシンプルに始めてみてはどうでしょうか。

python

1line1 = "21aaa" 2line2 = "bbb ccc=ddd,eee" 3line3 = re.sub("ddd", line1, line2) 4print(line3) #=> bbb ccc=21aaa,eee

質問にあった現象の話ですが、

python

1r"\1" + line1 + r"\3" 2r"\1" + "21aaa" + r"\3" 3'\121aaa\3'

と評価されます。なにかおかしなことが起こっているのがわかりますか?

投稿2021/09/13 05:12

mather

総合スコア6753

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pariparigorilla

2021/09/13 05:22

回答ありがとうございます。 line2の書式が一定のルールで決まっているので、上記のようになっており、そのまま添付してしまいましたが、原因解析時はおっしゃる通り、シンプルなものでやるべきですね。 勉強になりました。 ありがとうございます。
guest

0

ベストアンサー

原因は、置換後のr"\1" + line1 + r"\3"の先頭部分がr"\121"となるためです。
r"\g<1>" + line1 + r"\3"とすることで回避可能かと思います。

公式ドキュメントより引用

\g<number>は対応するグループ番号を使います。よって\g<2>\2と等価ですが、\g<2>0のような置換においても曖昧になりません。\20は、グループ20への参照として解釈され、グループ2への参照にリテラル文字'0'が続いたものとしては解釈されません。

投稿2021/09/13 05:08

kirara0048

総合スコア1399

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pariparigorilla

2021/09/13 05:17

早速ありがとうございます。 文字が続いてしまい、別の意味として捉えられていたことが理解できました。 共有していただいたグループ番号の定義方法で、やりたいことが実現できました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問