我正在使用python风格的正则表达式来有条件地匹配字符串。示例字符串如下:
field1 field2 field3 field4 field5 field6 http://domain/STRING1/part1/part2/part3/part4/part5/ABC000495835__CD__XYZ__ABCD__ABC__ABCDEF__ENG.xyz field8 field9 field10
field1 field2 field3 field4 field5 field6 http://domain/STRING2/part1/part2/part3/part4/part5/ABC000495835.xyz field8 field9 field10
提取条件如下:
我写了以下正则表达式:
(?i)^(?:[^ ]*( {1,2})){6}(?:[a-z]+://[-A-Z0-9.\:]+/)(STRING1/)?(?:[^ /]+/)*(?P<myField>(1)?[^_]+|[^ ]+)
虽然这个正则表达式适用于第一个样本字符串,但对于第二个字符串,它提取“ABC000495835.xyz field8 field9 field10”。
请告诉我出错的地方以及为什么条件正则表达式的if部分始终匹配。
答案 0 :(得分:3)
正则表达式中的第1组为( {1,2})
,第2组为(STRING1/)
,因此您需要相应地调整条件。
此外,您的条件语法错误。它应该是
(?i)^(?:[^ ]*( {1,2})){6}(?:[a-z]+://[-A-Z0-9.\:]+/)(STRING1/)?(?:[^ /]+/)*(?P<myField>(?(2)[^_]+|[^ ]+))
结果:
>>> regex = re.compile(r"(?i)^(?:[^ ]*( {1,2})){6}(?:[a-z]+://[-A-Z0-9.\:]+/)(STRING1/)?(?:[^ /]+/)*(?P<myField>(?(2)[^_]+|[^ ]+))")
>>> regex.search("field1 field2 field3 field4 field5 field6 http://domain/STRING1/part1/part2/part3/part4/part5/ABC000495835__CD__XYZ__ABCD__ABC__ABCDEF__ENG.xyz field8 field9 field10").group("myField")
'ABC000495835'
>>> regex.search("field1 field2 field3 field4 field5 field6 http://domain/STRING2/part1/part2/part3/part4/part5/ABC000495835.xyz field8 field9 field10").group("myField")
'ABC000495835.xyz'