2010-01-26 10 views
7

Estoy escribiendo un analizador usando ply que necesita identificar literales de cadena FORTRAN. Estos se citan con comillas simples con el carácter de escape que se duplican comillas simples. es decir,Cómo escribir una expresión regular para que coincida con un literal de cadena donde el escape es una duplicación del carácter de comillas?

'I don''t understand what you mean'

es una cadena válida escaparon FORTRAN.

Ply toma entrada en la expresión regular. Mi intento hasta ahora no funciona y no entiendo por qué.

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

¿Alguna idea?

Respuesta

20

Una cadena literal es:

  1. Una abierta comilla simple, seguido de:
  2. Cualquier número de-comillas simples se duplicó y la no-comillas simples, entonces
  3. Una comilla simple cierre .

Por lo tanto, nuestra expresión regular es:

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

Ah el zen de las expresiones regulares, gracias! – Brendan

+1

Esto no parece manejar las secuencias de escape. – Cyoce

4

quieres algo como esto:

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

Este dice que dentro de las comillas simples se puede tener comillas dobles o un no personaje de cita

Los corchetes definen una clase de caracteres, en la que se enumeran los caracteres que pueden coincidir o no. No permite nada más complicado que eso, por lo que tratar de usar paréntesis y hacer coincidir una secuencia de varios caracteres ('') no funciona. En su lugar, su clase de caracteres [^('')] es equivalente a [^'()], es decir, coincide con cualquier cosa que no sea una comilla simple o un paréntesis izquierdo o derecho.

0

Por lo general es fácil de conseguir algo rápido y sucio para analizar determinadas cadenas literales que le están dando problemas, pero para una solución general se puede obtener una expresión regular muy potente y completa para los literales de cadena de la pyparsing module:

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

No estoy seguro acerca de las diferencias significativas entre los literales de cadenas de FORTRAN y los de Python, pero es una referencia útil si nada más.

0
import re 

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

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

resultado

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