2014-07-01 11 views
7

Mój problem jest dość prosty.Jak re.sub() opcjonalna pasująca grupa używająca regex w Pythonie?

Mam adres URL, czasami kończy się on na określonych znakach. Jeśli są obecne, chciałbym dodać je do mojego nowego adresu 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" 

Oczywiście, nie mogę po prostu zrobić re.sub("url", "new_url", test), ponieważ na przykład może to być „url/123”, aw tym przypadku nie życzę, aby dokonać zmian.

Odpowiedz

6

Nie można użyć opcjonalnej grupy dopasowania w ciągu zastępczym.

Co powiesz na następujące podejście?

>>> 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, jeśli używasz regex, można użyć opcjonalnego grupę Dopasowanie:

>>> 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

dziękuję. Czy polecasz mi używanie modułu regex przez cały czas, czy tylko w tym przypadku? Jakie są główne różnice między re i regex? – Delgan

+0

@ user3779937, Nie, nie polecam używania go przez cały czas. 'regex' nie jest standardowym modułem bibliotecznym; musisz zainstalować osobno. – 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'