2009-04-19 5 views
79

"a (b) c (d) e"파이썬이 "b"대신 "b"와 일치하도록 "(. *)"와 같은 파이썬 정규 표현식을 어떻게 만들 수 있습니까? "?Python non-greedy regexes

". "대신"[^]] "을 사용할 수 있음을 알고 있지만 정규식을 조금 더 깨끗하게 유지하는보다 일반적인 솔루션을 찾고 있습니다. 파이썬에게 "어이, 가능한 빨리 일치"라고 말할 수있는 방법이 있습니까?

답변

97
+0

인터넷 아카이브에 따르면, 링크가 가리키는 모든 것은 파이썬 "re"모듈 문서의 사본이었습니다. 그래서 Trey의 링크는 잘 작동합니다. – spiffytech

+1

이'*? '의 일반적인 영어 이름은 무엇입니까? –

+0

와일드 카드 문자 @ Trevor Boyd Smith – Serge

11

\\(.*?\\) 작업은하지 않을까요? 그것은 욕심이없는 구문입니다.

51
>>> x = "a (b) c (d) e" 
>>> re.search(r"\(.*\)", x).group() 
'(b) c (d)' 
>>> re.search(r"\(.*?\)", x).group() 
'(b)' 

According to the docs :

'*', '+'및 '?'한정자 모든 욕심; 가능한 한 많은 텍스트와 일치합니다. 때때로이 동작은 바람직하지 않습니다. RE <.*>이 '<H1>title</H1>'과 일치하면 '<H1>'이 아닌 전체 문자열과 일치합니다. 한정자 뒤에 '?'을 추가하면 비 탐욕적이거나 최소한의 방식으로 일치를 수행합니다. 가능한 한 적은 수의 문자가 일치합니다. 이전 식에서 .*?을 사용하면 '<H1>'과 만 일치합니다.

+1

[정규식을 사용하여 HTML을 구문 분석하지 마십시오] (https://stackoverflow.com/a/1732454) –

2

"(b)"와 일치시겠습니까? Zitrax와 Paolo가 제안했듯이. "b"와 일치시겠습니까? ungreedy 일치하는 좋은 시작이다 사용

>>> x = "a (b) c (d) e" 
>>> re.search(r"\((.*?)\)", x).group(1) 
'b' 
2

수행,하지만 난 당신이 .*의 사용을 재고하는 것도 제안 것 - 무슨 일이 이것에 대해?

groups = re.search(r"\([^)]*\)", x) 
5

다른 사람들이? 수식어에 * 수식어는 즉각적인 문제를 해결할 것이지만 조심해야한다. 정규 표현식이 작동을 멈추고 대신 파서가 필요한 영역으로 이탈하기 시작한다. 예를 들어, 문자열 "(foo (bar)) baz"는 문제를 일으킬 것입니다.