いつも調べてしまうので、自分のためにコードを残しておこうと思います。
Pythonで正規表現を使って、文字列から特定の部分を取り出す方法です。
目次 非表示
括弧内の文字列だけ取り出す
文字列内の()
に囲まれた部分を取り出してみます
s = "this_(is)_a_(pen)_desu"
reg = '(?<=\().+?(?=\))'
ret = re.findall(reg, s)
print(ret)
# ['is', 'pen']
解説
正規表現は、(?<=\().+?(?=\))
になりますが、これは3つに分解して考えると理解できます。
- 「後読み」部分:
(?<=hoge)
の場合、”hoge”の後ろという意味をもつ正規表現です - 「先読み」部分:
(?=fuga)
の場合、”fuga”の前という意味をもつ正規表現です - パターンマッチ部分:
.+?
の場合、”.”は任意の一文字、”+”は直前の文字が一回以上、”?”は直前の文字が0 or 1回以上の最長一致です。
いくつか例をだしてみます。
# HOGEとFUGAで囲まれた部分を取り出す
s = 'this_HOGEisFUGA_a_HOGEpenFUGA_desu'
reg = '(?<=HOGE).+?(?=FUGA)'
print(re.findall(reg, s))
# ['is', 'pen']
# {}で囲まれている数値を取り出す
s = 'this_{123}_a_{abc}_desu'
reg = '(?<={)[0-9]+(?=})'
print(re.findall(reg, s))
# ['123']
括弧も一緒に取り出したい場合
括弧も一緒に取り出したい場合は簡単です。
s = 'this_{123}_a_{abc}_desu'
reg = '{.*?}'
print(re.findall(reg, s))
# ['{123}', '{abc}']
要するに、「後読み」も「先読み」も必要なくなります。