2017-02-20 27 views
0

在我的測試程序我得到的是這樣蟒蛇正則表達式搜索與lookarounds

str = "TestID277RStep01CtrAx-mn00112345" 

在這裏,我想用正則表達式來形成組輸入返回我下面

str = "Test(ID277)(R)(Step01)(CtrAx-mn001)12345" 

我的目標與4個瓦爾

var1 = "ID277" 
var2 = "R" 
var3 = "Step01" 
var4 = "CtrAx-mn001" 

到目前爲止我試過

落得
regx = ".*Test(ID[0-9]+)([RP]?)(Step(?=\d)\d+)?(Ctr(?=[A-Z][a-z]-/d{3}))?.*" 
re_testInp = re.compile (regx, re.IGNORECASE) 
srch = re_testInp.search(r'^' + str) 
print srch.groups() 

我似乎得到了前3組,但無法獲得最後一組。 幾乎貼近我的頭髮拉出這一個。任何幫助都感激不盡。

+0

如何從'... ReqAx-mn001 ...'中獲得'CtrAx-mn001'?另外,什麼是'| var 1 || var2 || var3 || var4 |'? –

+0

Tx @PhuNgo指出。道歉「要求」是一個錯字(這是另一個我希望能夠解決的變化)。詳細闡述了我的意思是var1,2 ... – Vishi

+0

'(?=)'lookaheads的用途是什麼? – glibdud

回答

0

與Python3.6.0工作對我來說很好,下面的模式:

.*Test(ID[0-9]+)([RP]?)(Step(?=\d)\d+)?(.*\-(?=[A-Za-z][a-z]\d{3})[A-Za-z][a-z]\d{3})?.* 

我只改最後捕獲組,我將解釋什麼是錯的,在我看來,你包括模式: *(Test(ID [0-9] +)([RP]?)(Step(?= \ d)\ d +)? (CTR(= [AZ] [AZ]/d {3})?) *

請注意,因爲大膽的捕獲組不會找到匹配:?

  1. 您嘗試爲了匹配文字'Ctr',你也沒有考慮文字' - '。我不知道什麼是你嘗試完全匹配有可能的文字,但我把它概括爲:* -
  2. 你寫/d {3},而不是\ d {3}

  3. 在包含的測試字符串中:'... ReqAx- m n ...'m較低。如果你想支持小寫,你應該改變模式爲:(Ctr(?= [A-Za-z] [a-z]/d {3})))。

  4. 您不正確使用lookahead斷言。正如指出:https://docs.python.org/3/library/re.html

    (?= ...)

    匹配,如果...下一個比賽,但不消耗任何的字符串。 這被稱爲超前斷言(lookahead assertion)。例如,Isaac(?= Asimov) 只有跟着'Asimov'纔會匹配'Isaac'。

    含義應捕獲組更改爲:?(* - (= [A-ZA-Z] [AZ] \ d {3})[A-ZA-Z] [AZ] \ d {3})

在:(工序(?= \ d)\ d +)我想你想到的第一個數字將在先行斷言被捕獲,但兩個數字是由以下\ d +

奔抓獲。

+0

與([A-Za-z] [az] \ d {3})[A-Za-z] [az] \ d {3} [AZ] \ d {3}'? – glibdud

+0

還有一個'?'最後意味着整個組是可選的,也許OP意圖取消比賽資格而不繼續評估字符串的其餘部分。 他將整個模式封裝在:。\ *和。\ * – Ben

+0

非常感謝@BenA的修復。這就像一個魅力。 +1進行詳細解釋。確實非常有用。 – Vishi