python regExp搜索与lookarounds

时间:2017-02-20 17:48:35

标签: python regex

在我的测试程序中,我得到的输入类似于

str = "TestID277RStep01CtrAx-mn00112345"

在这里,我想使用regExp来形成返回以下内容的组

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组正确,但无法获得最后一组。 几乎接近用这个把我所有的头发拉出来。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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})?.*

我只更改了最后一个捕获组,因为我会用你所包含的模式解释出错了什么:

。*测试(ID [0-9] +)([RP]?)(步骤(?= \ d)\ d +)?的(CTR(?= [AZ] [AZ] / d { 3}))?*

请注意,以粗体显示的捕获组无法找到匹配项,因为:

  1. 您尝试匹配文字' Ctr',您也没有考虑文字' - '。我不知道您尝试匹配的可能文本是什么,但我将其概括为:。* -
  2. 你写了 / d {3} 而不是 \ d {3}

  3. 在测试字符串中,您包括:' ... ReqAx- m n ...' m是较低的套管。您应该将模式更改为:( Ctr(?= [A-Za-z] [az] / d {3}))如果您还想支持小写。

    < / LI>
  4. 您没有正确使用前瞻断言。如:https://docs.python.org/3/library/re.html

    中所述
      

    (?= ...)

         

    匹配if ...匹配next,但不消耗任何字符串。   这称为先行断言。例如,艾萨克(?=阿西莫夫)   将匹配艾萨克&#39;只有当它跟随阿西莫夫时才会出现。

    意味着您应该将捕获组更改为:(。* - (?= [A-Za-z] [az] \ d {3})[A-Za-z] [az] \ d {3})

  5. 在:(步骤(?= \ d)\ d +)我假设您认为在前瞻断言中会捕获第一个数字,但这两个数字都被以下 \捕获d +

    本。