2013-12-17 25 views
5

Per la vita di me non riesco a capirlo.Regex per abbinare una o due virgolette ma non tre di fila

ho bisogno di cercare il seguente testo, rispettando solo le citazioni in grassetto:

non corrispondono: "" "Questa è una docstring python" ""

partita: " questa è una stringa regolare "

partita: "" ← questa è una stringa vuota

Come posso farlo con un'espressione regolare?

Ecco che cosa ho provato:

non funziona:

(?!"")"(?<!"") 

Vicino, ma non corrisponde virgolette doppie.

non funziona:

"(?<!""")|(?!"")"(?<!"")|(?!""")" 

ho ingenuamente pensato che avrei potuto aggiungere i sostituti che non voglio ma la logica finisce invertita. Questo corrisponde a tutto perché tutte le virgolette corrispondono ad almeno una delle alternative.

(Si prega di notare:. Io non sto correndo il codice, quindi le soluzioni intorno usando __doc__ non aiuterà, io sto solo cercando di trovare e sostituire nel mio editor di codice)

risposta

13

È possibile utilizzare /(?<!")"{1,2}(?!")/

DEMO

Autopsy:

  • (?<!") un look-behind negativo per il letterale ". La partita non può avere questo carattere di fronte
  • "{1,2} letterale " abbinato una o due volte
  • (?!") negativo look-ahead per letterale ". La partita non può avere questo carattere dopo

vostra prima prova potrebbe aver riuscita perché (?!") è un aspetto negativo look-ahead, e (?<!") è un aspetto negativo look-dietro. Non ha senso avere look-ahead prima della partita, o look-behind dopo la partita.

Regular expression visualization

+0

Grande, grazie! In realtà, a volte ha senso avere lookheadhead prima di una partita, per escludere (o includere) possibili corrispondenze. Nel mio caso, stavo vedendo se potevo farne uso per guardare il set completo, ma non aggiungeva alcun valore. – Nicole

+0

Mi sono appena reso conto che dovevo abbinare solo un carattere di virgoletta singolo alla volta. Per favore controlla [la mia risposta] (http://stackoverflow.com/a/20643701/143295) ... mi hai aiutato ad arrivarci. Non ho cambiato la domanda originale perché hai risposto perfettamente (e non volevo fare una nuova domanda che fosse così simile). – Nicole

+0

@NickC Nessun problema. Speriamo che qualcun altro possa usare questa risposta un giorno. :) – h2ooooooo

1

mi sono reso conto che la mia descrizione originale problema era in realtà un po 'sbagliato. Cioè, ho bisogno di in realtà corrispondere solo a singolo quota carattere, a meno che non sia parte di un gruppo di quote caratteri.

La differenza è che questo è auspicabile per la modifica in modo che possa trovare e sostituire con '. Se corrispondo a "una o due virgolette", non posso sostituire automaticamente con un singolo carattere.

sono arrivato fino a questa modifica al h20000000's answer che soddisfi questo caso:

(?<!"")(?<=(?!""").)"(?!"") 

Regular expression visualization

Nel demo, si può vedere che la "" sono abbinati individualmente, anziché come un gruppo.

Questo funziona in modo molto simile alla altra risposta, ad eccezione di:

  • esso corrisponde a un solo "
  • che ci lascia con corrispondenti tutto quello che vogliamo tranne che corrisponde ancora le quotazioni medie di un """:

    enter image description here

  • Infine, aggiungendo i (?<=(?!""").) esclude questo caso specifico, dicendo "guardare indietro di un carattere, poi non la partita, se i tre caratteri successivi sono """):

    enter image description here


non deciso per cambiare la domanda perché non voglio dirottare la risposta, ma penso che questa possa essere un'utile aggiunta.