2012-04-18 69 views
4

我是python的新手,需要一些正則表達式的幫助。Python中正則表達式的用法

我有一個字符串是這樣的:

新版本可用的版本:20120418-ABCDEF-1(基於SDK 0.0.0.1)從上面的字符串

我想用提取下面的文字正則表達式

20120418-ABCDEF-1 0.0.0.1

我可以拆分做到這一點,但我覺得它是這樣的無效方法。我嘗試使用正則表達式,但無法縮小範圍。

例如,我用

sdk_version = re.search(r"SDK(.*)", lines,) 
        print sdk_version.group(1) 

但是這給了版本0.0.0.1)與paranthesis一起,我不知道如何elimate「)」 ..在這裏需要一些幫助..

感謝 -Vijay

回答

2

假設版本號只能包含字母,數字,點劃線,這是所有你需要:

version, sdk = re.findall(r'(?:Version: |SDK)([\w.-]+)', s) 

例子:

s = "New builds available Version: 20120418-abcdef-1 (based on SDK 0.0.0.1)" 

import re 
version, sdk = re.findall(r'(?:Version: |SDK)([\w.-]+)', s) 

print version 
print sdk 

## 20120418-abcdef-1 
## 0.0.0.1 
1

也許你會想要做

>>> st="New builds available Version: 20120418-abcdef-1 (based on SDK 0.0.0.1)" 
>>> "".join(re.findall(":[ ]*(.*?)[ ]*\(.*SDK(.*)\)",st)[0]) 
'20120418-abcdef-1 0.0.0.1' 
1

佛特別是SDK版本,。*對於你想要的內容太寬泛了 - 它匹配所有內容,所以它將匹配整個字符串的其餘部分。您可以使用正則表達式主體「SDK([0-9。] +)」,然後取第一個組。 (「[0-9。] +」將匹配一串數字字符和句點。)

對於版本字符串,您可以匹配類似「Version:([a-bA-B0-9- ] +)(」並採取第一組 - 這說你正在尋找一個字母數字字符和連字符組成的字符串,後面跟一個空格和一個開放式括號

2
>>> s = "New builds available Version: 20120418-abcdef-1 (based on SDK 0.0.0.1)" 
>>> import re 
>>> version = re.compile(r"(?<=Version:)\d*-[a-z]*-\d") 
>>> version.search(s).group() 
'20120418-abcdef-1' 

這符合

(preceded by "Version: ") 
a string of digits 
hyphen 
a string of lowercase letters 
hyphen 
a digit 

同樣,

>>> subversion = re.compile(r"(?<=SDK)\d*.\d*.\d*.\d*") 
>>> subversion.search(s).group() 
'0.0.0.1' 

比賽

(preceded by "SDK ") 
a string of digits 
a dot 
a string of digits 
a dot 
a string of digits 
a dot 
a string of digits 
2

好吧,我不知道您的所有字符串看起來完全像你提供將所提供的一個,但對於確切字符串的正則表達式:

: (.*) \(based on SDK (.*)\) 

這將執行以下操作:

- 在a出現後開始匹配。

- 這將打開一個組(這是對正則表達式,這將允許您以後參考捕捉值的特殊結構)

。* - 這部分只是簡單地匹配一切,直到一個空間。

\( - 這將匹配一個「真正的」支柱和不開一個亞組

\) - 這將與「真正的」右括號並不會關閉子組。

所以在python這應該是這樣的:

import re 
s = "New builds available Version: 20120418-abcdef-1 (based on SDK 0.0.0.1)" 
r = re.compile(r": (.*) \(based on SDK (.*)\)") 
m = r.search(s) 
m.groups() 
>> ('20120418-abcdef-1', '0.0.0.1') 
1

@Gjallar已經寫了一個很好的答案。這裏是點小文章他的回答:

import re 
s = "New builds available Version: 20120418-abcdef-1 (based on SDK 0.0.0.1)" 
r = re.compile(r":\s+(.*)\s+\(based on SDK\s+(\S+)\s*\)") 
m = r.search(s) 
m.groups() 
>> ('20120418-abcdef-1', '0.0.0.1') 

幾個地方,他有一個空間,我\s+相匹配的一個或多個任何種類的空格代替它。因此,如果有額外的空間進入,或選項卡,或者其他任何東西,這仍然會匹配。

同樣,我改變了SDK字符串的模式。首先,我將它從.*更改爲\S+,所以它根本不匹配任何內容,而只匹配非空白字符,並且必須至少有一個。我還添加了\s*,它匹配零個或多個任何類型的空白區域。如果沒有空白區域,這將不會做任何事情,但如果有一些它將匹配它;但它不在括號內,因此它不會捕獲空白區域。因此,SDK字符串匹配,但不會包含任何空格:

s = "New builds available Version: 20120418-abcdef-1 (based on SDK 0.0.0.1)" 

隨着@ Gjallar的原有格局,將SDK的字符串將是"0.0.0.1 "但我的模式,你仍然可以得到"0.0.0.1"