developer tip

정규 표현식으로 겹치는 일치를 찾는 방법은 무엇입니까?

optionbox 2020. 11. 27. 08:01
반응형

정규 표현식으로 겹치는 일치를 찾는 방법은 무엇입니까?


>>> match = re.findall(r'\w\w', 'hello')
>>> print match
['he', 'll']

\ w \ w는 두 문자를 의미하므로 'he'와 'll'이 예상됩니다. 그러나 'el'과 'lo' 가 정규식과 일치 하지 않는 이유는 무엇입니까?

>>> match1 = re.findall(r'el', 'hello')
>>> print match1
['el']
>>>

findall기본적으로 겹치는 일치를 생성하지 않습니다. 그러나이 표현식은 다음을 수행합니다.

>>> re.findall(r'(?=(\w\w))', 'hello')
['he', 'el', 'll', 'lo']

다음 (?=...)예견 주장입니다 .

(?=...)...다음에 일치하면 일치하지만 문자열을 소비하지 않습니다. 이를 미리보기 주장이라고합니다. 예를 들어 Isaac (?=Asimov)'Isaac '뒤에 오는 경우에만 일치 합니다 'Asimov'.


겹치는 일치를 지원 하는 새로운 Python regex 모듈을 사용할 수 있습니다 .

>>> import regex as re
>>> match = re.findall(r'\w\w', 'hello', overlapped=True)
>>> print match
['he', 'el', 'll', 'lo']

길이가 0 인 어설 션을 제외하고 입력의 문자는 항상 일치에 사용됩니다. 입력 문자열의 특정 문자를 한 번 더 캡처하려는 경우 정규식에서 길이가 0 인 어설 션이 필요합니다.

길이가 0 인 어설 션 (예 : ^(입력 / 줄의 시작), $(입력 / 줄의 끝), \b(단어 경계))이 여러 개 있지만, 둘러보기 ( (?<=)긍정적 룩-비하인드 및 (?=)긍정적 인 룩-어 헤드)가 유일한 방법입니다. 입력에서 겹치는 텍스트를 캡처 할 수 있습니다. 네거티브 룩 어라운드 ( (?<!)네거티브 룩 비하인드, (?!)네거티브 룩어 헤드)는 여기서 그다지 유용하지 않습니다. 그들이 참이라고 주장하면 내부 캡처가 실패한 것입니다. 거짓이라고 주장하면 일치가 실패합니다. 이러한 주장은 길이가 0 (앞서 언급했듯이)이므로 입력 문자열의 문자를 사용하지 않고 주장합니다. 어설 션이 통과되면 실제로 빈 문자열과 일치합니다.

위의 지식을 적용하면 귀하의 경우에 적합한 정규식은 다음과 같습니다.

(?=(\w\w))

정규식 전문가는 아니지만 비슷한 질문 에 대답하고 싶습니다 .

미리보기와 함께 캡처 그룹을 사용하려는 경우 :

정규식 예 : (\ d) (? =. \ 1)

문자열 : 5252

이것은 처음 5 개와 처음 2 개와 일치합니다.

(\ d)는 캡처 그룹을 만드는 것이고, (? = \ d \ 1)는 문자열을 소비하지 않고 캡처 그룹 1이 뒤 따르는 숫자와 일치하므로 겹침을 허용합니다.

참고 URL : https://stackoverflow.com/questions/11430863/how-to-find-overlapping-matches-with-a-regexp

반응형