2015-03-31 70 views
0

考慮一個字符串django-1.8.0.dist-info。我希望使用re.sub將其轉換爲django==1.8.0python re.sub如何使用它

我可以使用re.search.format的組合,但我想知道是否可以用re.sub來實現。

我嘗試這樣做:

re.sub(r"(?P<name>\w+)-(?P<version>[\d\.]+)", "\g<name>==\g<version>", "django-1.8.0.dist-info")返回django==1.8.0.dist-info

我想借此機會學習正則表達式的新東西。

回答

2
(?P<name>\w+)-(?P<version>[\d\.]+)\..* 

使用this.Just捕獲最後一部分以及See.See演示。

https://regex101.com/r/sJ9gM7/23#python

+0

Thanx爲ans。你能幫我理解re.sub的本質嗎?爲什麼它也取代了非捕獲組。我認爲它只會取代被俘的組織。 – learner010 2015-03-31 06:12:45

+0

@ learner010're.sub'匹配您給出的所有內容,並且只替換該部分。因此,如果要替換它,必須匹配整個字符串。您匹配部分字符串,然後替換,以便它將僅替換該部分 – vks 2015-03-31 07:03:35

2

不知道你真正需要使用正則表達式,但你是什麼後,你可以簡單地實現如下:

s="django-1.8.0.dist-info" 

s=s.replace(".dist-info", "").replace('-','==')  

print(s) # django==1.8.0 

一個正則表達式可能是:

import re 
s="django-1.8.0.dist-info" 
s = re.sub(r'^(\w+)-([\d\.]{5})(.+)', r'\1==\2', s) 
print(s) # django==1.8.0 

該表達式構成3組。

  • 組一個是字符,直到-
  • 組兩個是5個字符(數字或點),版本號爲
  • 組三是休息
+0

omg,爲什麼我沒有想到它,它確實解決了我的問題,但我仍然想知道是否可以使用're.sub'實現相同的結果。我想知道它的正確用例。 – learner010 2015-03-31 06:10:22

+0

@ learner010當然可以。一個可能的正則表達式在我修正的答案中。 – Marcin 2015-03-31 06:19:13

2

你的正則表達式是幾乎確定,但你不想替換 - 你應該使用re.matchre.search

>>> "==".join(re.match(r"(?P<name>\w+)-(?P<version>[\d\.]+)", "django-1.8.0.dist-info").groups()) 
'django==1.8.0.' 

正如@Avinash指出 - 有在端

這裏額外.被以固定的正則表達式(和使用re.findall的一個例子)的一種方法:

>>> s = "django-1.8.0.dist-info" 
>>> "==".join(*re.findall(r"(\w+)-(\d+(?:\.\d+)*)", s)) 
'django==1.8.0' 

我離開了該組(希望)清晰度的名稱