"아무것도 일치하지 않음"에 대한 정규 표현식 구문?


82

regexp를 많이 사용하는 파이썬 템플릿 엔진이 있습니다. 다음과 같은 연결을 사용합니다.

re.compile( regexp1 + "|" + regexp2 + "*|" + regexp3 + "+" )

개별 하위 문자열 (regexp1, regexp2 등)을 수정할 수 있습니다.

일치하지 않는 템플릿 내에서 사용할 수있는 아무것도 일치하지 않는 작고 가벼운 표현이 있습니까? 불행히도 때때로 '+'또는 '*'가 regexp 원자에 추가되어 빈 문자열을 사용할 수 없습니다.이 경우 "반복 할 항목 없음"오류가 발생합니다.



3
제목이 "어떤 것과도 일치하지 않는 정규식"으로 더 잘 표현할 수 있습니까? 아무것도 일치하지 않는 것은 빈 문자열이 성공적으로 일치 함을 의미합니다.
BamaPookie

답변:


123

이것은 아무것도 일치하지 않아야합니다.

re.compile('$^')

따라서 regexp1, regexp2 및 regexp3을 '$ ^'로 바꾸면 일치하는 항목을 찾을 수 없습니다. 다중 회선 모드를 사용하지 않는 한.


몇 가지 테스트 후 더 나은 해결책을 찾았습니다.

re.compile('a^')

일치하는 것은 불가능하며 이전 솔루션보다 일찍 실패합니다. a를 다른 문자로 바꿀 수 있으며 일치하는 것은 항상 불가능합니다.


그것은 확실히 아무것도 일치하지 않으며 regexp 엔진이 처리하기 위해 가볍습니까? (내 그루터기는 CPU를 많이 먹고 regexps '에 싶지 않아)
grigoryvp

@ 지옥의 눈. 가벼워 야합니다. 이것은 줄 끝과 줄 시작을 일치 ​​시키려고 할 것입니다. 한 줄로는 불가능합니다.
Nadia Alramli

1
그러나 물론 여러 줄로 가능합니다 (플래그가 활성화되었는지 여부에 따라 다름)-플래그 활성화 여부에 관계없이 작동하는 솔루션에 대해서는 내 대답을 참조하십시오.
Peter Boughton

16
정규식 "$ ^"는 적어도 일부 구현에서 빈 문자열과 일치합니다. 두 번째가 더 좋습니다.
Roman Starkov

@romkyns 두 번째는 PyQt4 호출에서 빈 문자열과 일치하지 않습니다 QtCore.QRegExp. 실행하기에 더 가벼 웠을 것입니다.
Joël 2014 년

43

(?!)항상 일치하지 않아야합니다. 너비가 0 인 네거티브 미리보기입니다. 괄호 안의 내용이 일치하면 전체 일치가 실패합니다. 그 안에 아무것도 없다는 점을 감안할 때, 아무것도 포함하지 않는 모든 것에 대한 일치가 실패합니다.


4
맞아요, 나도 이걸 게시하려고 했어요. 언어가 미리보기를 지원하는 경우 이것이 가장 좋은 방법입니다. 마찬가지로 (? =)는 모든 문자열과 일치합니다.
Brian Carper

16

여러 줄 모드에서도 빈 문자열을 일치 시키려면를 사용할 수 있습니다 \A\Z.

re.compile('\A\Z|\A\Z*|\A\Z+')

차이점은 \Aand \Zstring의 시작과 끝 이지만 ^, $이들은 줄의 시작 / 끝과 $^|$^*|$^+일치 할 수 있으므로 바꿈을 포함하는 문자열과 잠재적으로 일치 할 수 있습니다 (플래그가 활성화 된 경우).

그리고 아무것도 일치하지 않는 경우 (빈 문자열 포함), 문자열 시작 전에 콘텐츠를 찾으려고 시도하십시오. 예 :

re.compile('.\A|.\A*|.\A+')

\ A (정의상) 앞에는 어떤 문자도 올 수 없으므로 항상 일치하지 않습니다.


나는 그것이 줄의 끝을 사용하는 것보다 더 빨리 나갈 것이라고 가정하기 때문에 당신은 내 것보다 더 좋아 보입니다.
ShuggyCoUk

피터, 당신은 \ z (소문자)를 사용하고, 파이썬 포켓 가이드에서 문자열의 끝이 \ Z (대문자)라고 말해 주나요?!
ThomasH

ThomasH, 둘 다 문자열의 끝이지만 대문자 버전은 후행 개행을 허용하는 반면 소문자는 그렇지 않습니다.
Peter Boughton

음, 흥미 롭 네요. 문서화 된 곳이 없습니다. 또한 re.search ( "boo \ z", "fooboo") 는 일치 개체를 반환하지 않는 반면 re.search ( "boo \ Z", "fooboo) 는 일치 개체를 반환합니다 . 오히려 re.search ("boo \ z ","foobooz ") 는 '\ z'가 단순히 'z'로 해석된다는 사실을 말합니다. 맞죠?! (파이썬 2.6에 있음)
ThomasH

아 죄송합니다. Python이 PCRE라고 생각했지만 몇 가지 차이점이있는 것으로 나타났습니다. 이것이 그중 하나입니다. ( regular-expressions.info/refflavors.html 에서 'Anchors'참조 )
Peter Boughton


1

당신이 사용할 수있는
\z..
이 아무것도 두 다음, 문자열의 절대 끝

+또는 *끝에 고정되어 있으면 여전히 작동합니다.


개야? IIRC는와 \z달리 후행 줄 바꿈을 허용하지 않으므로 \Z충분하지 않습니까? 또는 이것은 이상한 방어 *(왜
그것을 막고

0

또는 목록 이해력을 사용하여 쓸모없는 정규 표현식 항목을 제거하고 결합하여 모두 합치십시오. 다음과 같은 것 :

re.compile('|'.join([x for x in [regexp1, regexp2, ...] if x != None]))

그래도 코드 줄 옆에 주석을 추가하십시오 :-)

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