【Python】括弧の中の文字列を抜き出したい【正規表現】

日曜日, 10月 06, 2019

Python 自然言語処理

t f B! P L
正規表現の先読み・後読みの話です。
いつも調べてしまうのでメモ。
Pythonコードのサンプル付きです。

括弧の中の文字列を抜き出したい(括弧はいらない)

括弧の中身がほしいけど、括弧はついてこなくていいパターン。

(?<=pattern1).+?(?=pattern2)

を使います。
pattern2のほうが先読み、1のほうが後読みです。
目的文字列から先走って読む、目的文字列からバックして読む、と覚えましょう。

これで、pattern1とpattern2に挟まれた任意の文字列が抜き出せます。
括弧の中の文字列を抜きたい場合は
pattern1 = "\("
pattern2 = "\)"
とすればよいです。
ただし半角丸括弧は、正規表現で予約済み文字列なのでバックスラッシュでエスケープします。
また、文字列が数値やアルファベットなどに限定される場合は、.+?の部分を変えましょう。

import re

text = "abc(def)ghi"
re.findall("(?<=\().+?(?=\))", text) # ['def']


括弧ごと中身も文字列から削除したい

括弧ごとごっそり消したいパターン。
こっちのほうが楽です。
先読み、後読みは不要で、バックスラッシュでエスケープした括弧をそのまま書くだけです。
検索findallではなく、置換subを使います。
text = "abc(def)ghi"
re.sub("\(.+?\)", "", text) # 'abcghi'


例えば、日本のWikipediaのテキストは丸括弧が多いです。
言語モデルを学習する際には、悪影響な感触があるので消したいときなど。


括弧だけ消したい

括弧は消したいけど、括弧内の文字列は残しておきたいパターン。
1番簡単です。

text = "(abc)"
re.sub("\(|\)", "", text) # abc

text = "def"
re.sub("\(|\)", "", text) # def

括弧で開始・終了する文字列の括弧を取り除きたい場合などです。
0文字目と-1文字目を削除すればいいんですが、括弧がない文字列も混在しているようなデータだと場合分けが面倒。
こちらの正規表現なら括弧がない文字列はそのまますり抜けるのでスマートです。


今日のベストプラクティス

正規表現はいちいち調べない。

QooQ