파이썬 욕심없는 정규식


150

어떻게 같은 파이썬 정규식을해야합니까 "(.*)", 제공하도록 "a (b) c (d) e"파이썬이 일치하는 "b"대신 "b) c (d"?

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

답변:


209

당신은 모든 강력한 추구 *?

문서에서 욕심 대 비 욕심

비 탐욕 한정자 *?, +?, ??, 또는 {m,n}?[...] 같은 검색 작은 가능한 텍스트.


인터넷 아카이브에 따르면, 모든 링크는 Python "re"모듈 문서의 복사본 일 뿐이므로 Trey의 링크도 마찬가지로 작동합니다.
spiffytech

2
이것에 대한 일반적인 영어 이름은 *?무엇입니까?
Trevor Boyd Smith

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

3
이것을 "욕심없는" 한정
자라고합니다

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

문서에 따르면 :

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


14

\\(.*?\\)작동 하지 않습니까? 이것이 욕심없는 구문입니다.


5

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


5

욕심없는 일치를 사용하는 것이 좋은 시작이지만, 나는 당신의 사용을 재고 할 것을 제안합니다 .*.

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

3

"(b)"와 일치 하시겠습니까? Zitrax와 Paolo가 제안한대로하십시오. "b"와 일치 하시겠습니까? 하다

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

0

우선, 정규 표현식에 "*"를 사용하지 않는 것이 좋습니다. 예, 가장 많이 사용되는 다중 문자 구분 기호이지만 그럼에도 불구하고 나쁜 생각입니다. 이는 해당 문자에 대해 반복되는 양과 일치하지만 "any"는 0을 포함합니다. 이는 일반적으로 구문 오류를 발생시키고 수락하지 않으려는 것입니다. 대신 +길이가 1보다 큰 반복과 일치 하는 부호를 사용하는 것이 좋습니다 . 더 중요한 것은 무엇보다, 고정 길이 괄호로 묶인 표현식을 다루고 있습니다. 결과적으로 {x, y}구문을 사용하여 원하는 길이를 구체적으로 지정할 수 있습니다 .

그러나 정말로 욕심없는 반복이 필요하다면, 모든 강력한 상담을 제안합니다 ?. 이것은 정규 표현식 반복 지정자 끝에 배치되면 정규 표현식의 해당 부분이 가능한 한 적은 양의 텍스트를 찾도록 강제합니다.

그 존재는 내가 매우 조심 것이라고 말했다 ?신중하게 보정하지 않으면 나는 "약간"원하지 않는 물건을 넣어하는 방법, 박사 누구의 소닉 스크루 드라이버처럼 수행하는 경향이있다, 그것으로. 예를 들어, 입력 예를 사용하려면 ((1)일치 하는 것으로 식별합니다 (두 번째 rparen이 없음에 유의).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.