前提・実現したいこと
x = 'ABC (abc) (def)'
y = 'ABC (efg)'
という2つの文字列があり、正規表現を使って後ろの括弧だけから文字列を抜きだしたい。
xからは'def'、yからは'efg'を抜き出したい。
以下のコードではyは意図したとおりに抜き出せたが、xではコードを変更する必要がありそう。
同じコードでどちらも意図したように文字列を抜き出せないでしょうか?
これは単純化した例で、文字列はもっと複雑で、3文字では無いです。
括弧の数は例のように1~2個で、2個の場合は半角スペースで隣接しています。
該当のソースコード
Python
1#In 2x = 'ABC (abc) (def)' 3y = 'ABC (efg)' 4 5pattern=re.compile(r'(?<=().+(?=))') 6x_result=pattern.search(x).group().strip() 7y_result=pattern.search(y).group().strip() 8print (x_result) 9print (y_result) 10 11#Out 12abc) (def 13efg 14
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
ベストアンサー
単純に、
Python
1for a in ["ABC (abc) (def)","ABC (efg)"]: 2 b = re.search(r".*((.*?))",a) 3 print(b.group(1))
でいいかと思います。
前半に最長マッチである.*
を書けば最後の括弧がヒットします。
投稿2021/11/17 10:39
総合スコア85901
0
質問にある、
x = 'ABC (abc) (def)' y = 'ABC (efg)'
という二つの入力サンプルから、何をどこまで前提としてよいのか? がはっきりしていると、より分かりやすい正規表現で対応できるかと思います。たとえばサンプルから読み取れる、入力文字列の条件として
- 入力文字列の最後の文字は
)
である。 - 対になる
(
と)
とに囲まれる部分は[a-z]+
(あるいは、\w+
など) としておけば事足りる。
というものなのであれば、以下でよいかと思います。
python3
1import re 2 3x = 'ABC (abc) (def)' 4y = 'ABC (efg)' 5 6regexp = r'(\w+))$' 7 8m = re.search(regexp, x) 9 10for text in [x, y]: 11 m = re.search(regexp, text) 12 if m: 13 print(m.group(1)) 14 15
出力結果:
def
efg
追記1
正規表現を使うというのがお題なのだとは思いますが、必ずしも正規表現を使わずとも、以下でもよいのではないかと思えました。
python3
1x = 'ABC (abc) (def)' 2y = 'ABC (efg)' 3 4for text in [x, y]: 5 lastword = text.split(' ').pop().strip('()') 6 print(lastword) 7
出力結果:
def
efg
追記2
コメントから頂きました、
実際の文字列内にはスペースもあるので、
というのは、(
と )
で囲まれた文字列にはスペース(などの空白記号)が含まれる可能性がある、ということと解釈しました。そうだとすると、確かに上記の追記1 だと対応できませんね。
(
と )
で囲まれた文字列の前提条件としては、
(
と)
は含まれない
という制約のみとしつつも、split
を使えないか?と考えると、正規表現モジュールre
の split を使って、これでもいけそうです。
Python3
1import re 2 3x = 'ABC (ab c) (d ef)' 4y = 'ABC (e f g)' 5 6for text in [x, y]: 7 lastword = re.split(r'[()]', text)[-2] 8 print(lastword) 9
出力結果:
d ef
e f g
投稿2021/11/17 05:12
編集2021/11/17 10:06退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/17 06:21
退会済みユーザー
2021/11/17 10:13
2021/11/17 12:52
0
Python
1import re 2 3def inLastParen(text): 4 pattern = re.compile(r'((.*?))') 5 groups = pattern.findall(text) 6 return groups[-1] if len(groups) > 0 else '' 7 8x = 'ABC (abc) (def)' 9y = 'ABC (efg)' 10z = 'ABC xxx' 11 12print (inLastParen(x)) 13print (inLastParen(y)) 14print (inLastParen(z))
投稿2021/11/17 04:18
編集2021/11/17 06:50総合スコア8402
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/17 04:46
2021/11/17 06:28
2021/11/17 06:54
2021/11/17 08:47
0
今のコードを活かしたいなら、次のようなパタンでしょうか。
python
1# 後ろのカッコが文字列の最後の場合 2pattern = re.compile(r'(?<=()[^()]*(?=)$)') 3 4# 後ろのカッコ以降も文字がある場合 5pattern = re.compile(r'(?<=()[^()]*(?=)[^()]*$)')
.
(全部)を[^()]
(カッコ以外)に変更したのと、
閉じカッコ以降にカッコが出てこないという条件を追加しています。
投稿2021/11/17 04:45
総合スコア4794
0
python
1import re 2 3x = 'ABC (abc) (def)' 4y = 'ABC (efg)' 5 6pattern = re.compile(r'((.*?))') 7x_result = re.findall(pattern, x)[-1].strip() 8y_result = re.findall(pattern, y)[-1].strip() 9 10print(x_result) 11print(y_result) 12 13# 14def 15efg
投稿2021/11/17 04:06
総合スコア20655
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/17 04:45
2021/11/17 04:59
2021/11/17 05:00
2021/11/17 05:02
2021/11/17 05:16
2021/11/17 05:19 編集
2021/11/17 05:37
2021/11/17 06:00
0
あらかじめ文字列内に ( が何回出てくるかをcountで確認しておいて、1回出てくる場合と2回出てくる場合で正規表現を分けるのはダメなのでしょうか?
正規表現だけで実装する方法は自分だとわからないですね。
投稿2021/11/17 04:03
総合スコア227
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/17 12:58
2021/11/17 14:12
2021/11/17 14:24
2021/11/18 00:52