2010-08-19 5 views
41

나는 그 안에 인용 된 문자열을 여러 개 가질 수있는 문자열을 파싱합니다. (코드를 파싱하고 PLY를 피하려고합니다.) 하위 문자열이 인용되었는지 알아보고 하위 문자열 색인을 갖고 싶습니다. 필자의 초기 생각은 re를 사용하여 모든 일치 항목을 찾은 다음 이들이 나타내는 인덱스의 범위를 파악하는 것이 었습니다.파이썬에서 모든 정규식 일치의 색인을 찾으십니까?

\"[^\"]+\"|'[^']+'과 같은 regex를 사용해야하는 것처럼 보입니다. (지금은 트리플 인용 부호와 같은 문자열을 다루지 않습니다.) findall()을 사용할 때 일치하는 문자열 목록을 얻습니다. 다소 좋지만 색인이 필요합니다.

내 하위 문자열은 c과 같이 간단 할 수 있으며이 특정 c이 실제로 인용되는지 여부를 알아야합니다.

미리 감사드립니다.

+0

정규식에는 적합하지 않은 소리가납니다. –

답변

95

이 당신이 원하는 무엇인가 : (source)

re.finditer(pattern, string[, flags]) 

반환 문자열에서 RE 패턴에 대한 모든 겹치지 않는 경기를 통해 MatchObject 인스턴스를 산출하는 반복자. 문자열은 왼쪽에서 오른쪽으로 이며, 일치하는 항목은 발견 된 순서대로 반환됩니다. 비어있는 항목은 시합의 시작 부분을 터치하지 않는 한 결과에 포함됩니다.

그런 다음 MatchObject에서 시작 및 끝 위치를 가져올 수 있습니다.

[(m.start(0), m.end(0)) for m in re.finditer(pattern, string)] 
+0

굉장! 그건 잘 작동합니다. 고맙습니다. – xitrium

+24

실제로는'm.span()'을 사용하여'(m.start(), m.end())'를 얻을 수 있습니다 (기본 그룹 인수는'0'이므로 생략 가능합니다). – Amber

+1

Brilliant. 정확하게 이것을 찾고 있었어요. – armandino

관련 문제