2014-07-01 7 views
7

Il mio problema è piuttosto semplice.Come re.sub() un gruppo di corrispondenza facoltativo usando regex in Python?

Ho un URL, a volte finisce con caratteri specifici. Se sono presenti, vorrei aggiungerli al mio nuovo URL.

test1 = "url#123" 
test2 = "url" 

r = re.sub(r"url(#[0-9]+)?", r"new_url\1", test1) 
# Expected result: "new_url#123" 
# Actual result: "new_url#123" 

r = re.sub(r"url(#[0-9]+)?", r"new_url\1", test2) 
# Expected result: "new_url" 
# Actual result: "error: unmatched group" 

Naturalmente, non posso fare re.sub("url", "new_url", test), perché ad esempio potrebbe essere "url/123" e in questo caso non voglio fare modifiche.

risposta

6

Non è possibile utilizzare il gruppo di abbinamento opzionale nella stringa di sostituzione.

E il prossimo approccio?

>>> import re 
>>> test1 = "url#123" 
>>> test2 = "url" 
>>> re.sub(r"url((?:#[0-9]+)?)", r"new_url\1", test1) 
new_url#123 
>>> re.sub(r"url((?:#[0-9]+)?)", r"new_url\1", test2) 
new_url 

BTW, se si utilizza regex, è possibile utilizzare gruppo corrispondente opzionale:

>>> import regex 
>>> test1 = "url#123" 
>>> test2 = "url" 
>>> regex.sub(r"url(#[0-9]+)?", r"new_url\1", test1) 
'new_url#123' 
>>> regex.sub(r"url(#[0-9]+)?", r"new_url\1", test2) 
'new_url' 
+0

Grazie. Mi consigliate di usare il modulo regex tutto il tempo, o solo in questo caso? Quali sono le principali differenze tra re e regex? – Delgan

+0

@ user3779937, No, non mi consiglia di usarlo tutto il tempo. 'regex' non è un modulo di libreria standard; è necessario installare separatamente. – falsetru

0
In [4]: re.sub(r"url(#[0-9]+|$)", r"new_url\1", test1) 
Out[4]: 'new_url#123' 

In [5]: re.sub(r"url(#[0-9]+|$)", r"new_url\1", test2) 
Out[5]: 'new_url' 
0
re.sub(r'url(#*.*)', r'url\1', test1) 
Problemi correlati