前提・実現したいこと
正規表現でマッチしたhref属性を
リスト[0]→[1]→[2]の順に置換したいと考えています。
以下の方法では、すべてリスト[0]に置換されてしまいます。
ご教示いただければ幸いです。何卒よろしくお願いいたします。
(前回、BeautifulSoupでzipを使った置換方法を教えていただきました。
https://teratail.com/questions/225332
今回は、htmlではないテキスト文書を置換する場合を考えたところ(サンプルはhtmlですが)
zipを使ったもの、そうでないものを考えたのですが行き詰ってしまい、また相談をさせていただいた次第です。
よろしくお願いいたします。)
該当のソースコード
html
1<!-- リスト afters = ['after_11', 'after_24', 'after_32']--> 2 3<body> 4 5<a href="https://www.nochange.com/"></a> <!-- →変更しない --> 6 7<div class="sample"> 8 <a href="https://www.change.com/before_a/test"></a> <!-- →https://www.change.com/リスト[0]/test に変更--> 9</div> 10<div class="sample"> 11 <a href="https://www.change.com/before_b/test"></a><!-- →https://www.change.com/リスト[1]/test に変更--> 12</div> 13<div class="sample"> 14 <a href="https://www.change.com/before_c/test"></a><!-- →https://www.change.com/リスト[2]/test に変更--> 15</div> 16 17<a href="https://www.none.com/"></a><!-- →変更しない --> 18 19</body>
python
1import re 2from pathlib import Path 3 4PATH = '/Users/○○/test.html' 5afters = ['after_11', 'after_24', 'after_32'] 6 7def changeurl(m): 8 for after in afters: 9 return f'https://www.change.com/{after}/test' 10 11html = Path(PATH) 12 13html_text = html.read_text() 14 15after_html = re.sub(r'https://www.change.com/[A-Za-z0-9_]+/test', changeurl, html_text) 16 17 18"""結果:すべてリスト[0]に置換されてしまいます。 19print(after_html) 20<body> 21 22<a href="https://www.nochange.com/"></a> 23 24<div class="sample"> 25 <a href="https://www.change.com/after_11/test"></a> 26</div> 27<div class="sample"> 28 <a href="https://www.change.com/after_11/test"></a> 29</div> 30<div class="sample"> 31 <a href="https://www.change.com/after_11/test"></a> 32</div> 33 34<a href="https://www.none.com/"></a> 35 36</body>"""
python
1#zipを使ったこちらの内容も、希望する結果となりませんでした 2import re 3from pathlib import Path 4 5PATH = '/Users/○○/test.html' 6afters = ['after_11', 'after_24', 'after_32'] 7pattern = r'https://www.change.com/([A-Za-z0-9_]+)/test' 8 9html = Path(PATH) 10html_text = html.read_text() 11 12matchs = re.finditer(pattern, html_text) 13 14for match, after in zip(matchs, afters): 15 after_html = re.sub(r'https://www.change.com/[A-Za-z0-9_]+/test', after, match.group()) 16 17 18"""結果 19print(after_html) 20after_11 21after_24 22after_32
補足情報(FW/ツールのバージョンなど)
Python 3.6.5
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/01 03:45
2019/12/01 03:50