###前提・実現したいこと
pythonとpyQtで作られているオープンソースのankiという単語帳アプリに検索して置換するという機能があり、そこでPythonの正規表現を使って単語帳の中身をある条件で置換をしたいのですがうまくいきません。
具体的には以下のように、置換前の「@@@の直後の1以上999以下の数値」を取得して置換後の文字列「<img src="hogehoge_xxx.png" />」のxxxに埋め込みたいです。このxxxは本のページ数です。以後この置換前の文字を便宜上サンプルとします。
#置換前のサンプル @@@123 @@@23 @@@34 @@@45 @@@56
↓
#置換後のサンプル(この結果が欲しい) <img src="hogehoge_123.png" /> <img src="hogehoge_23.png" /> <img src="hogehoge_34.png" /> <img src="hogehoge_45.png" /> <img src="hogehoge_56.png" />
このように取得したいのですが、この123や23や34などを抽出したいときどのように書くのでしょうか?re.sub()
で\1
を使用しても意図したようにいきませんでした。(参照:reモジュール)
###発生している問題・エラーメッセージ
上記サンプルを以下の画像のようにankiアプリ上で正規表現を使用して置換すると数字の一桁目だけが抽出されてしまいます。
#置換前のサンプル @@@123 @@@23 @@@34 @@@45 @@@56
#置換後のサンプル(数字の最後の一桁だけ抽出される) img src="hogehoge_3.png" img src="hogehoge_3.png" img src="hogehoge_4.png" img src="hogehoge_5.png" img src="hogehoge_6.png"
上記の問題では置換をGUIで実行していますが、ankiのソースコードのl.497のrepl関数を見る限り、pythonではおそらく以下のようなことをしていると考えています。しかし私のpowershell上での実行結果は適切に表示されず、確認できない状態になってしまっています。ただ、適切に表示されない部分(=)が一文字なので置換後のサンプルと多分同じ挙動だと思われます。
#resub.py import re regex = re.compile("@@@(\d){1,3}") reSub = re.sub(regex,"img src=hogehoge_\1.png","@@@123\n@@@23\n@@@34\n@@@45\n@@@56\n") print(reSub)
PS > python -V Python 2.7.14 PS > python .\resub.py img src=hogehoge_.png img src=hogehoge_.png img src=hogehoge_.png img src=hogehoge_.png img src=hogehoge_.png
###該当のソースコード
ankiのソースコードのfindReplace関数(l.481からl.528)で検索して置換するを実装をしていると思われます。
###試したこと
①サンプルを置換文字列\2
で実行 → 無効な処理と表示される(おそらくエラー)
②サンプルを置換文字列\0
で実行 → サンプルがすべて消える
#③の結果 333 333 444 555 666
###補足情報(言語/FW/ツール等のバージョンなど)
Windows10
Python2系
以上になりますがどうぞよろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/08 16:57
2018/01/08 16:59