2012-11-13 9 views
5

Desidero utilizzare un'espressione regolare python per rimuovere i commenti in un file LaTeX. In LaTeX un commento inizia con "%". Ma se il carattere% è sfuggito ("\%") allora non è un commento, è la percentuale del simbolo.backslash in un set di caratteri di un'espressione regolare python (come specificare il set di caratteri "non un backslash")?

Questa attività è solo una delle molte espressioni regolari che applico sul testo LaTeX. Conservo tutti questi reg in una lista di dict.

Il problema che devo affrontare è che la regexp che utilizzo per l'eliminazione dei commenti non funziona (perché non so come specificare il set di caratteri "non backslash"). Il backslash nel set di caratteri sfugge alla chiusura ']' e l'espressione regolare non è corretta.

Il mio codice:

regexps=[] 
regexps.append({r'left':'%.*', 'right':r''}) # this strips all the comments, but messes up with the percent characters (\%) 
regexps.append({r'left':'[^\]%.*', 'right':r''}) # this is incorrect (escapes the closing "]") 
return applyRegexps(latexText, regexps) 


def applyRegexps(text, listRegExp): 
    """ Applies successively many regexps to a text""" 
    if testMode: 
     print str(listRegExp) 
    # apply all the regexps in the list 
    for element in listRegExp: 
     left = element['left'] 
     right = element['right'] 
     r=re.compile(left) 
     text=r.sub(right,text) 
    return text 

Qualsiasi aiuto sarà molto apprezzato. Grazie!

Gilles

+0

Hai provato a usare 'r '[^ \\]''? Il '' dovrebbe essere la sintassi regex per l'escape del backslash – Bakuriu

+0

Se si desidera inserire una barra rovesciata letterale in un'espressione regolare, raddoppiarla. Il tuo patter dovrebbe leggere '[^ \\]%. *' –

+0

Grazie ragazzi, Martijn Pieters risponde alle opere. Devo essere stanco ... – user1821466

risposta

5

Basta raddoppiare la barra rovesciata, ma farlo utilizzare una stringa grezzo letterale per evitare di dover raddoppiare loro nuovo:

regexps.append({'left':r'[^\\]%.*', 'right':r''}) 
+1

La stringa non elaborata per 'sinistra' non è necessaria ... – l4mpi

+0

@ l4mpi: in effetti, ma l'OP aveva una stringa non elaborata anche per la chiave. –

1

Anche se la risposta di Martijn Pieters è quello che hai chiesto, ho non sono sicuro che questo è ciò che stai davvero cercando. Ad esempio questo pattern non corrisponderà a un % come il primo carattere della stringa (perché non c'è un carattere non-backslash davanti ad esso). Che cosa si vuole realmente è probabilmente un lookahead negativo (hai ancora bisogno di fuggire il backslash):

r'(?<!\\)%.*' 

La differenza è questa:

  • [^\\]% corrisponde a un % preceduto da un carattere non backslash (compresi quel personaggio nella partita)
  • (?<!\\)% corrisponde a un % che non è preceduto da una barra rovesciata (senza includere nel match)
0.123.

Quest'ultimo è vero anche per % all'inizio della stringa.

Problemi correlati