後読みの正規表現をはじめて使った
要するにやりたかったこと
1 |
text = '((A)この括弧(1回目))と((B)この括弧(2回目))は((C)別の括弧(3回目))' |
っていう文字列を、こういう風に分解したい。
1 |
['((A)この括弧(1回目))', '((B)この括弧(2回目))', '((C)別の括弧(3回目))'] |
どうするか?
この正規表現を書く
1 |
re.findall(r'\(.+?(?<!A|B|C)(?<!\d回目)\)', text) |
そもそも後読みの正規表現ってどうして必要?
例外の文字列を定義したい時に使う。例外の文字を定義するだけなら、^メタ文字で例外定義できる。
でも、2文字以上の文字列は後よみ(先読み)の例外定義が必要。
今回は ( ) の中に囲まれた文字列を獲得したいので、対象が文字列になる。
したがって、後読み(先読み)の正規表現が必要。
そもそも後読みと先読みの正規表現?
今回はどこか後読み?
1 |
(?<!A|B|C) と(?<!\d回目)が<span style="color: #ff0000" class="text-color">後よみの否定</span>である。 |
まず(?<!A|B|C)。この否定が存在しないと、A or B or C直後の ) で正規表現のマッチがはじめってしまう。
次に(?<!\d回目)。この否定が存在しないと、1つ目の ) で正規表現のマッチが終わってしまう。
※ 別解的に ) の出現回数を定義しても、解決できる。
実は・・・
いままで後読みと先読みを使ったことがなかった。
正規表現と後処理で、むりやりに解決していた。
でも、今回のように後読みと先読みでスッキリ解決?
ディスカッション
コメント一覧
まだ、コメントがありません