2010-12-20 9 views
8

ersetzt bekam ich eine Zeichenfolge, die wie diesePython regulären Ausdruck Teil eines abgestimmten Schnur

"myFunc('element','node','elementVersion','ext',12,0,0)" 

i zur Zeit für die Gültigkeit bin Überprüfung mit, die feinen

arbeitet
myFunc\((.+?)\,(.+?)\,(.+?)\,(.+?)\,(.+?)\,(.+?)\,(.+?)\) 

jetzt aussehen könnte i‘ Ich möchte die Zeichenfolge ersetzen, die sich am 3. Parameter befindet. Leider kann ich nicht einfach einen stringreplace auf irgendeinen Sub-String auf der 3. Position verwenden, da der gleiche 'Sub-String' irgendwo anders in diesem String sein könnte.

mit diesem und einem re.findall,

myFunc\(.+?\,.+?\,(.+?)\,.+?\,.+?\,.+?\,.+?\) 

konnte ich den Inhalt der Teilkette auf der 3. Position bekommen, aber re.sub die Zeichenfolge ersetzt nicht es gibt mir nur die Zeichenfolge i wollen mit ersetzen:/

mein Code hier
myRe = re.compile(r"myFunc\(.+?\,.+?\,(.+?)\,.+?\,.+?\,.+?\,.+?\)") 
val = "myFunc('element','node','elementVersion','ext',12,0,0)" 

print myRe.findall(val) 
print myRe.sub("noVersion",val) 

eine Ahnung, was ich verpasst habe?

danke! Seb

+2

Die Vielfalt der Antworten hier führt mich zu glauben, dass die Pythonic Revolte gegen Perl TIMTOWTDI Motto war etwas fehlgeleitet. :) –

Antwort

1

Wenn Sie dies tun wollen, ohne Regex:

>>> s = "myFunc('element','node','elementVersion','ext',12,0,0)" 
>>> l = s.split(",") 
>>> l[2]="'noVersion'" 
>>> s = ",".join(l) 
>>> s 
"myFunc('element','node','noVersion','ext',12,0,0)" 
+1

Was ist, wenn das erste Argument "Ele, ment" lautet? –

+3

Dann schlagen alle Antworten fehl, einschließlich der regulären Ausdrücke. :) – dheerosaur

+0

Sie haben Recht! deshalb denke ich, dass ein Parser für diese Aufgabe am besten geeignet ist als ein regulärer Ausdruck. –

7

In re.sub, benötigen Sie einen Ersatz für den ganzen passenden String angeben. Das bedeutet, dass Sie die Teile wiederholen müssen, die Sie nicht ersetzen möchten. Dies funktioniert:

myRe = re.compile(r"(myFunc\(.+?\,.+?\,)(.+?)(\,.+?\,.+?\,.+?\,.+?\))") 
print myRe.sub(r'\1"noversion"\3', val) 
3

Wenn Ihr einziges Werkzeug ein Hammer ist, sehen alle Probleme wie Nägel aus. Ein regulärer Ausdruck ist ein kraftvoller Hammer, ist aber nicht das beste Werkzeug für jede Aufgabe.

Einige Aufgaben werden besser von einem Parser behandelt. In diesem Fall wird die Argumentliste in der Zeichenfolge ist wie ein Python-Tupel, sou Sie betrügen kann: die Python eingebaute Parser verwenden:

>>> strdata = "myFunc('element','node','elementVersion','ext',12,0,0)" 
>>> args = re.search(r'\(([^\)]+)\)', strdata).group(1) 
>>> eval(args) 
('element', 'node', 'elementVersion', 'ext', 12, 0, 0) 

Wenn Sie nicht der Eingang für diese ast.literal_eval ist sicherer als eval vertrauen können. Sobald Sie die Argumentliste in der dekonstruierten Zeichenkette haben, denke ich, dass Sie herausfinden können, wie Sie sie bei Bedarf wieder manipulieren und wieder zusammensetzen können.

2

Lesen Sie die Dokumentation: re.sub gibt eine Kopie der Zeichenfolge zurück, in der jedes Vorkommen des gesamten Musters durch das Ersetzen ersetzt wird. Es kann die ursprüngliche Zeichenfolge in keinem Fall ändern, da Python-Zeichenfolgen unveränderlich sind.

Versuchen Vorgriffs mit und schauen Hinterher Behauptungen einen regulären Ausdruck zu konstruieren, die nur das Element passt sich:

myRe = re.compile(r"(?<=myFunc\(.+?\,.+?\,)(.+?)(?=\,.+?\,.+?\,.+?\,.+?\))") 
+1

Wenn es ein Argument gibt, das ein Komma enthält, wird der Regex-Ansatz immer schwieriger. –

Verwandte Themen