[python] “아무것도 일치하지 않음”에 대한 정규 표현식 구문?

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

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

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

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



답변

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

re.compile('$^')

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


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

re.compile('a^')

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


답변

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


답변

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

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

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

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

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

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


답변

어쩌면 '.{0}'?


답변

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

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


답변

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

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

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


답변