2017-09-30 1 views
1

다음 파이썬 코드를 사용하여 작업 : 정규식 lookbehind하지 re.match

import re 

line="http://google.com" 
procLine = re.match(r'(?<=http).*', line) 
if procLine.group() == "": 
    print(line + ": did not match regex") 
else: 
    print(procLine.group()) 

이 성공적으로 일치하지 않는 경우, 다음과 같은 오류 출력 : 난 그냥와 정규식을 교체 할 때

Traceback (most recent call last): File "C:/Users/myUser/Documents/myScript.py", line 5, in if procLine.group() == "": AttributeError: 'NoneType' object has no attribute 'group'

합니다. * 괜찮 았던 것을 나타내는 정규식을 제안하는 것은 괜찮습니다. 그러나 https://regex101.com/에서 정규식과 문자열을 파이썬 맛을 테스트 할 때 잘 일치하는 것처럼 보입니다.

아이디어가 있으십니까? 당신이 비 캡처 그룹에 lookbehind를 변환하면

+1

당신은 대신'search'를 사용 ([문서] https://docs.python.org/을 확인 할 수 있습니다 3/library/re.html # regular-expression-syntax) : "긍정적 인 lookbehind 어설 션으로 시작하는 패턴은 검색되는 문자열의 시작 부분에서 일치하지 않으므로 search() 함수를 사용하는 것이 좋습니다() 함수보다 " – niemmi

답변

1

이 작동해야하십시오 lookbeind가 작동하지 않습니다

In [7]: re.match(r'(?:http://)(.*)', line) 
Out[7]: <_sre.SRE_Match object; span=(0, 17), match='http://google.com'> 

In [8]: _.group(1) 
Out[8]: 'google.com' 

이유이기 때문에 - Rawing mentioned로 - re.match 시작의 시작에서 찾고 문자열이므로 뒤에시작 문자열의 의미가 없습니다.


당신이 lookbehind를 사용하여 주장하는 경우, re.search로 전환 :

In [10]: re.search(r'(?<=http://).*', line) 
Out[10]: <_sre.SRE_Match object; span=(7, 17), match='google.com'> 

In [11]: _.group() 
Out[11]: 'google.com' 
+0

고마워,이 일을했고, 이것을 해결 방법으로 사용 하겠지만, 누군가가 w를 안다면 지금 올바른 것으로 표시하지 않을 것이다. 하이 lookbehinds 나를 실패한 것 같습니다. –

+0

@LostCrotchet 왜냐하면'match'는 string _의 _start에 정규식을 적용하기 때문입니다. 문자열의 시작 부분에 * 보이는 * 모양이 작동하지 않습니다. –

+0

@Rawing 그것은 나의 의심이었다. 그러나 나는 확실하지 않고 그것을 쓰고 싶지 않았다. 추가 할 수 있는지 알려 주시면 답변을 작성하겠습니다. –

관련 문제