2016-04-26 10 views
2

Das Beispiel Zeichenfolge in Python ist "sasi0'sada1\'adad2'theend"Regex nicht bekommen das entwichene Zitat

ich die einfachen Anführungszeichen wollen, die nicht entgangen sind, so zitiert nach 0 und 2 sollte aber nicht das Zitat nach 1.

ausgewählt werden

Ich versuchte re.findall(r"[\d]'"), aber ich bekomme alle Baum Zitate Irgendwelche Hilfe?

Lassen Sie mich Ihnen das tatsächliche Szenario erzählen! Ich schreibe ein Skript, um SQL-Abfragen aus dem Code zu extrahieren. Perl-Code:

ad.pl:$query = "Select * from (Select ((select cast(sysdate as ts) from dual)||(select c_r from v\$r_limit where r_n=\'sessions\')||\',\'||(select c_u from v\$r_l where r_n=\'t\')) as \"D,B,HH,AS,CT\" from dual)"; 

Die Regex:

re.compile(r'''(('|")(insert |update |delete |select)(.*?)(?<!\)(\2)(;?))''',re.IGNORECASE) 

aber die Rückseite Referenz das entwichene doppelten Anführungszeichen ist ansteckend. , so dass nur halbe Abfrage

Ich glaube nicht, dass ich zusätzlichen Backslash automatisch hinzufügen kann, um es zu entkommen, wie Python nicht lesen \ in erster Linie, um andere hinzuzufügen! manuell ist es unmöglich zu entkommen, weil das ist ein riesiges Projekt mit vielen Abfragen. Irgendwelche Hilfe?

+0

'= \' ............... –

+0
+0

@ rock321987 Ich versuchte Ihren Vorschlag, aber immer noch bekomme alle Zitate – sasidhar513

Antwort

1

wird die folgende regex

(?<!\\)(?=') 

oder

(?=(?<!\\)') 

Ideone Demo

Wenn Ihre Anforderung so einfach ist, wie Sie bereits erwähnt, arbeiten dann brauchen Sie nicht einmal umschauen. Es kann einfach als

[^\\]' 

Der Grund für regex ist nicht geschrieben werden alle Zitate passend, weil python ist \' innen Stachel als eine Möglichkeit der Interpretation ' weil in Python-Strings zu entkommen kann sowohl mit einfachen und doppelten Anführungszeichen dargestellt werden. Also im Grunde die linke Zeichenfolge gelegt werden, ist

sasi0'sada1'adad2'theend 

enter image description here

Diese modifizierte Zeichenfolge keine \' enthält. Also alle ' ist abgestimmt. Wenn Sie entfliehen der ' doppelt so

sasi0'sada1\\'adad2'theend 

Was dann die Lösung ist?

Verwenden Sie eine rohe Zeichenfolge anstelle einer normalen Zeichenfolge.Dies kann, indem r vor Zeichenfolge vor doppelte Anführungszeichen

r"sasi0'sada1\'adad2'theend" 
+0

danke.Ich habe die Frage erweitert! bitte guck dir das an! Können wir das Hinzufügen eines zusätzlichen Backslashs automatisieren, wenn wir einen einzelnen Schrägstrich gefolgt von 'oder " – sasidhar513

+0

@ sasidhar513 nur vor'' oder '"? – rock321987

+0

ja ich denke. das ist der tatsächliche Code kann nicht unnötige Backslashes hinzufügen! Ich habe versucht hinzuzufügen, aber gescheitert! – sasidhar513

0

\' in diesem Fall \ fungierte als Zufluchtsort für ' so müssen Sie dieses die '\' auch entkommen getan werden \\'

re.findall(r"[^\\]'","sasi0'sada1\\'adad2'theend") 
["0'", "2'"] 
+0

danke bekommen.Ich habe die Frage erweitert! bitte guck dir das an! können wir das Hinzufügen eines zusätzlichen Schrägstrichs automatisieren, wenn wir einen einzelnen Schrägstrich erhalten, gefolgt von 'oder' – sasidhar513

0

Dieser scheint für mich zu arbeiten. \w((?<!\\)([\w']+))