2010-01-26 6 views
7

ply을 사용하여 FORTRAN 문자열 리터럴을 식별해야하는 파서를 작성했습니다. 이것들은 큰 따옴표로 인용되며 이스케이프 문자는 작은 따옴표 두 개가 사용됩니다. 즉이스케이프가 따옴표 문자를 두 배로하는 문자열 리터럴과 일치하는 정규식을 작성하는 방법은 무엇입니까?

'I don''t understand what you mean'

유효한가 FORTRAN 문자열을 탈출한다.

Ply은 정규 표현식으로 입력됩니다. 지금까지의 시도는 효과가 없으며 그 이유를 이해하지 못합니다.

t_STRING_LITERAL = r"'[^('')]*'"

어떤 아이디어가? 문자

답변

20

문자열은 다음과 같습니다

  1. 오픈 따옴표, 다음 : 다음
  2. 배 - 작은 따옴표 및 비 작은 따옴표 임의의 수의,
  3. 닫기를 따옴표 .

따라서, 우리의 정규식은 다음과 같습니다

r"'(''|[^'])*'" 
+1

아 정규 표현식의 선, 감사합니다! – Brendan

+1

이것은 이스케이프 시퀀스를 처리하지 않는 것 같습니다. – Cyoce

4

당신이 뭔가를 원하는 :

r"'([^']|'')*'" 

이 작은 따옴표 안에 큰 따옴표 또는 비 중 하나를 가질 수 있다고 말한다 인용 문자.

대괄호는 일치하거나 불일치하는 문자를 나열하는 문자 클래스를 정의합니다. 그것보다 복잡한 것은 허용하지 않으므로 괄호를 사용하고 복수 문자 시퀀스 ('')과 일치 시키려고하면 작동하지 않습니다. 대신 [^('')] 문자 클래스는 [^'()]과 동일합니다. 즉, 작은 따옴표 나 왼쪽 또는 오른쪽 괄호가 아닌 모든 것과 일치합니다.

0

그것은 당신에게 문제를주고있다 특정 문자열 리터럴을 구문 분석에 대한 빠른 앤 더러운 뭔가를 얻기 위해 일반적으로 쉽게,하지만 일반적인 솔루션을 당신은 pyparsing module에서 문자열 리터럴에 대한 매우 강력하고 완전한 정규식 얻을 수 있습니다 :

>>> import pyparsing 
>>> pyparsing.quotedString.reString 
'(?:"(?:[^"\\n\\r\\\\]|(?:"")|(?:\\\\x[0-9a-fA-F]+)|(?:\\\\.))*")|(?:\'(?:[^\'\\n\\r\\\\]|(?:\'\')|(?:\\\\x[0-9a-fA-F]+)|(?:\\\\.))*\')' 

FORTRAN의 문자열 리터럴과 Python의 차이점에 대해서는 잘 모르겠지만 그 밖의 것이 없다면 편리한 참고 자료입니다.

0
import re 

ch ="'I don''t understand what you mean' and you' ?" 

print re.search("'.*?'",ch).group() 
print re.search("'.*?(?<!')'(?!')",ch).group() 

결과

'I don' 
'I don''t understand what you mean'