2012-07-28 4 views
0

인용구로 된 문자열 (블랙 박스에서 기록한 항공사 조약 따옴표)에 대한 텍스트 문서를 조사하는 python 정규 표현식을 작성했습니다. 나는 다음 규칙들로 정규 표현식을 작성하려고 시도했다 :python 정규 표현식에서 괄호의 이상한 동작

따옴표 사이에 무엇이 반환되는지.
단일으로 열리는 경우 하나만 닫으면 반환됩니다.
두 번으로 열리는 경우 두 번으로 닫을 경우에만 반환됩니다.

예를 들어 나는 "hi there"또는 "hi there"와는 일치하지 않지만 "hi there"와 "hi there"와 일치하고 싶습니다.

CA "Runway 18, wind 230 degrees, five knots, altimeter 30." 
AA "Roger that" 
18:24:10 [flap lever moving into detent] 
ST: "Some passenger's pushing a switch. May I?" 

그래서 나는 간단한 시작하기로 결정 :이 정규 표현식은 매우 예기치 않게 역할을

re.findall('("|\').*?\\1', page) 
########## /("|').*?\1/ <-- raw regex I think I'm going for. 

내가 좋아하는 일을 포함하는 테스트 페이지를 사용합니다.
는 내가 생각했던 것 :

  1. ("|")로 다시/1을 참조 저장, 단일 또는 이중이든 따옴표를 맞 춥니 다. *.?
  2. . *? 비 탐욕스러운 와일드 카드와 일치합니다.
  3. \ 1 역 참조 \ 1에서 찾은 것과 일치합니다 (1 단계).

대신 따옴표 배열을 반환하지만 결코 다른 것을 반환하지 않습니다.

['"', '"', "'", "'"] 

동등한 (afaik) 정규식이 VIM에서 정상적으로 작동하기 때문에 나는 정말 혼란스러워합니다.
왜 경기로 괄호 안에있는 것만을 반환 않습니다

\("\|'\).\{-}\1/) 

내 질문은 이것이다? 이것은 역 참조에 대한 나의 이해의 결함입니까? 그렇다면 왜 VIM에서 작동합니까?

내가 파이썬에서 찾고있는 정규식을 작성하려면 어떻게해야합니까?

도움 주셔서 감사합니다.

답변

0

the documentation을 읽으십시오. re.findall은 그룹이 있으면 그룹을 리턴합니다. 전체 경기가 필요한 경우 모두 그룹화하거나 re.finditer을 사용해야합니다. this question을 참조하십시오.

+0

문서화가 여전히 의미가 없었습니다. 왜냐하면 그룹은 대조군이 아니라 잠재 성 일치를 의미하기 때문입니다. 그걸 정리 해줘서 고마워. –

1

여분의 괄호 쌍을 사용하여 모든 것을 포착해야합니다.

re.findall('(("|\').*?\\2)', page) 
3

파이썬이 반환하는 따옴표를 제외하고 아무것도 캡처하지 않습니다.다른 그룹을 추가하는 경우

는 상황이 훨씬 더 잘 작동 :

for quote, match in re.finditer(r'("|\')(.*?)\1', page): 
    print match 

내가 당신의 톤을 사용해야하는 경우에 유용하다 원시 문자열을 만들기 위해 r하여 문자열 리터럴 접두사 백 슬래시 (\\1\1이됩니다).

+0

좋아요! 그러나 이것은 표현의 일부가 대조군에 속한다면 다른 모든 것은 대조군에 속해야한다는 것을 의미합니까? –

+0

일치하는 그룹의 내부 항목은 정규식으로 검색 할 때 반환되는 항목입니다. 전체 정규식을 일치 시키려면 그룹의 모든 것을 래핑하십시오. – Blender