在我的测试程序中,我得到的输入类似于
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组正确,但无法获得最后一组。 几乎接近用这个把我所有的头发拉出来。任何帮助将不胜感激。
答案 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}))强>?*
请注意,以粗体显示的捕获组无法找到匹配项,因为:
你写了 / d {3} 而不是 \ d {3}
在测试字符串中,您包括:' ... ReqAx- m n ...' m是较低的套管。您应该将模式更改为:( Ctr(?= [A-Za-z] [az] / d {3}))如果您还想支持小写。
< / LI>您没有正确使用前瞻断言。如:https://docs.python.org/3/library/re.html
中所述(?= ...)
匹配if ...匹配next,但不消耗任何字符串。 这称为先行断言。例如,艾萨克(?=阿西莫夫) 将匹配艾萨克&#39;只有当它跟随阿西莫夫时才会出现。
意味着您应该将捕获组更改为:(。* - (?= [A-Za-z] [az] \ d {3})[A-Za-z] [az] \ d {3})强>
在:(步骤(?= \ d)\ d +)我假设您认为在前瞻断言中会捕获第一个数字,但这两个数字都被以下 \捕获d + 强>
本。