質問: 私はPythonを勉強中のものです 私は手動でダウンロードしたvttファイル(字幕とその字幕をいつ流すか指定)を 字幕だけにしてtxtファイル化するプログラムを書いているのですが良い正規表現が思いつきません Python3を使っています ### ファイルの例 ``` WEBVTT 00:01.852 --> 00:04.000 4月の勉強講座へようこそ! 00:24.007 --> 00:26.710 今日はこの問題を解説していきたいと思います ``` このようなvttファイルがあるとしたら ``` 4月の勉強講座へようこそ! 今日はこの問題を解説していきたいと思います ``` という形にしたいのです。 ### 実現したい正規表現 1、vttファイルの頭にくる'WEBVTT'という文字列の削除 2、改行の削除 3、タイムコードの削除 自分で考えて書いてみましたがうまくいきませんでした ``` re.sub('\n{3}|(WEBVTT)|[-->]', '', vttstring) ``` 結果 ``` 月の勉強講座へようこそ! 今日はこの問題を解説していきたいと思います ``` 自分の作ったものだと4月の4という数字も一緒に消されてしまいます どなたか正解の正規表現また、なぜ私の正規表現は間違っていて"4"が消えてしまうのか教えてください。 よろしくお願いします。
回答: > > 正解の正規表現 > > > 同じようなアプローチでやるなら、こんな感じです。 ``` re.sub('\\n{2,}|WEBVTT|.*-->.*', '', vttstring) ``` > > なぜ私の正規表現は間違っていて"4"が消えてしまうのか教えてください。 > > > `[-->]`が諸悪の根源です。 この書き方をすると、ASCIIコード`-`以上`>`以下の文字が全削除されます。 ただし 正規表現を使うのは、もう少し局所的にした方がわかりやすいと思います。 ``` import re time_pattern = re.compile(r'\d{2}:\d{2}\.\d{3} --> \d{2}:\d{2}\.\d{3}') def vtt_strip(rows): for row in rows: # 空行は無視 if not row: continue # タイムコードは無視 if time_pattern.match(row): continue yield row with open('sample.vtt') as f: vtt_rows = [row.strip() for row in f.readlines()] vtt_string = '\n'.join(vtt_strip(vtt_rows[1:])) print(vtt_string) ``` **実行結果** Wandbox ``` 4月の勉強講座へようこそ! 今日はこの問題を解説していきたいと思います ```