괄호 사이에 텍스트를 반환하는 정규식


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그것이 존재하는지 모른다 는 은밀한 의심을 얻습니다 .
Kevin

답변:


247

문제가 정말 간단하다면 정규식이 필요하지 않습니다.

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

10
'('및 ')'가 없으면 어떻게됩니까? s [0 : -1]을 얻게됩니다. 즉, 's': \에서 무엇이든 얻을 수 있습니다. 먼저 문자열에 괄호가 있는지 확인하면 좋을 것입니다.
오마르

5
"(일부 텍스트 (내부 괄호 안의 일부 텍스트) 더 많은 텍스트)"가 있으면 어떻게됩니까?
Igor Pomaranskiy

4
그러면 문제는 원래 문제만큼 간단하지 않으며 다른 솔루션이 필요합니다.
tkerwin

1
이고르의 질문에 대해 이렇게 중첩 된 괄호가있는 경우 작업의 두 번째 부분에 rfind를 사용합니다. 이에 대한 자세한 내용은 아래 내 게시물을 참조하십시오.
FaustoW

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.