2017-02-20 67 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