정규 표현식으로 겹치는 일치를 찾는 방법은 무엇입니까?
>>> 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
'developer tip' 카테고리의 다른 글
C ++ 참조로 배열 전달 (0) | 2020.11.27 |
---|---|
모카의 글로벌`before`와`beforeEach`? (0) | 2020.11.27 |
요소를 기울이면서 텍스트를 정상적으로 유지하는 방법 (비뚤어지지 않음) (0) | 2020.11.27 |
파일이 있고 IS 디렉토리가 있지만 listFiles ()가 null을 반환합니다. (0) | 2020.11.27 |
React Native-동적 이름을 사용하는 이미지 요구 모듈 (0) | 2020.11.27 |