2014-07-01 14 views
7

Vấn đề của tôi khá đơn giản.Làm cách nào để re.sub() một nhóm đối sánh tùy chọn sử dụng regex bằng Python?

Tôi có một URL, đôi khi nó kết thúc bằng các ký tự cụ thể. Nếu có mặt, tôi muốn thêm chúng vào URL mới của tôi.

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" 

Tất nhiên, tôi không thể chỉ làm re.sub("url", "new_url", test), vì ví dụ nó có thể là "url/123" và trong trường hợp này tôi không muốn thực hiện sửa đổi.

Trả lời

6

Bạn không thể sử dụng nhóm đối sánh tùy chọn trong chuỗi thay thế.

Cách tiếp cận sau đây như thế nào?

>>> 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, nếu bạn sử dụng regex, bạn có thể sử dụng tùy chọn nhóm khớp:

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

Cảm ơn bạn. Bạn có khuyên tôi sử dụng mô-đun regex mọi lúc hay chỉ trong trường hợp này? Sự khác nhau chính giữa re và regex là gì? – Delgan

+0

@ user3779937, Không, tôi không khuyên bạn nên sử dụng nó mọi lúc. 'regex' không phải là một mô-đun thư viện chuẩn; bạn cần cài đặt riêng. – 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) 
Các vấn đề liên quan