2010-01-26 8 views
7

Sto scrivendo un parser utilizzando ply che deve identificare i valori letterali stringa FORTRAN. Questi sono citati con virgolette singole con il carattere di escape che viene duplicato con virgolette singole. cioèCome scrivere un'espressione regolare per abbinare una stringa letterale in cui la fuga è un raddoppio del carattere di citazione?

'I don''t understand what you mean'

è una valida sfuggito stringa FORTRAN.

Ply prende input nell'espressione regolare. Il mio tentativo finora non funziona e non capisco perché.

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

Tutte le idee?

risposta

20

Una stringa letterale è:

  1. Un open single-citazione, seguita da:
  2. numero qualsiasi di-apostrofi raddoppiati e apici non singole, quindi
  3. Un primo apice singolo .

Quindi, la nostra espressione regolare è:

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

Ah Lo Zen di espressioni regolari, grazie! – Brendan

+1

Questo non sembra gestire sequenze di escape. – Cyoce

4

volete qualcosa di simile:

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

Questo dice che all'interno delle singole citazioni si può avere sia doppie virgolette o un non- citare il carattere.

Le parentesi definiscono una classe di caratteri, in cui vengono elencati i caratteri che possono corrispondere o meno. Non consente nulla di più complicato, quindi provare a utilizzare le parentesi e ad associare una sequenza a più caratteri ('') non funziona. Invece la tua classe di caratteri [^('')] equivale a [^'()], cioè corrisponde a tutto ciò che non è una virgoletta singola o una parentesi sinistra o destra.

0

Di solito è facile ottenere qualcosa di veloce-e-sporco per l'analisi di particolari stringhe che si stanno dando problemi, ma per una soluzione generale è possibile ottenere una regex molto potente e completo per stringhe letterali dal pyparsing module:

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

Non sono sicuro delle differenze significative tra i valori letterali delle stringhe di FORTRAN e quelli di Python, ma è un utile riferimento se non altro.

0
import re 

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

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

risultato

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