括弧内のテキストを返す正規表現


113
u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')'

かっこ内のコンテンツが必要です。


ブラケット?角かっこは表示されません。かっこですか?
kzh

4
二重引用符を使用しないのはなぜですか?これにより、文字列が読みやすくなります。つまりu"abcde(date='2/xc2/xb2',time='/case/test.png')"
kzh

この質問は、それを見るだけで緊張します。私はこっそりの疑いを得ますOPは本当に機能が必要でastあり、それが存在することを知りません。
ケビン

回答:


247

あなたの問題が本当にこの単純なものであれば、正規表現は必要ありません:

s[s.find("(")+1:s.find(")")]

9
「(」と「)」がない場合はどうなりますか?s [0:-1]を取得します。つまり、「:」内の何でも取得できます。文字列に括弧があることを最初に確認すると良いでしょう。
オマール

5
「(一部のテキスト(内側の括弧内の一部のテキスト)その他のテキスト)」がある場合はどうなりますか?
Igor Pomaranskiy 2016

4
次に、問題は元の問題ほど単純ではなく、別の解決策が必要になります。
tkerwin

1
イゴールの質問について:そのようにネストされた括弧がある場合は、操作の2番目の部分にrfindを使用します。これについての詳細は、以下の私の投稿を参照してください。
FaustoW 2017

61

使用re.search(r'\((.*?)\)',s).group(1)

>>> import re
>>> s = u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')'
>>> re.search(r'\((.*?)\)',s).group(1)
u"date='2/xc2/xb2',time='/case/test.png'"

45

すべてのオカレンスを検索する場合:

>>> re.findall('\(.*?\)',s)
[u"(date='2/xc2/xb2',time='/case/test.png')", u'(eee)']

>>> re.findall('\((.*?)\)',s)
[u"date='2/xc2/xb2',time='/case/test.png'", u'eee']

ばかげた質問かもしれませんが、なぜ「?」必要ですか?「(。*)」が機能しないのはなぜですか?
CutePoison

3
@CutePoison .*は、貪欲である(最長の試合を取る)と.*?貪欲ではない(最短の試合を取る)
dopstar

29

あなたが持って起こる場合は、tkerwinの回答を踏まえ、ネストされた括弧のように

st = "sum((a+b)/(c+d))"

彼の答えは、あなたが間にあるすべて取る必要がある場合には動作しません。最初の左括弧最後の閉じ括弧取得するために(a+b)/(c+d)から検索検索文字列の左にあるため、最初閉じ括弧で停止します。

これを修正するにrfindは、操作の後半で使用する必要があるため、次のようになります。

st[st.find("(")+1:st.rfind(")")]

1
@ALHその式には括弧がネストされていません。これが私の答えに適しています。
FaustoW

6
import re

fancy = u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')'

print re.compile( "\((.*)\)" ).search( fancy ).group( 1 )

2
contents_re = re.match(r'[^\(]*\((?P<contents>[^\(]+)\)', data)
if contents_re:
    print(contents_re.groupdict()['contents'])

このコードは質問に答えることがありますが、問題を解決する方法および/または理由に関する追加のコンテキストを提供すると、回答の長期的な価値が向上します
sshashank124
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.