条件正则表达式与else部分不匹配

时间:2014-02-24 12:24:26

标签: python regex

我正在使用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

提取条件如下:

  1. 当第7个字段中存在STRING1时,应提取最后一个和第一个_之间的字符。
  2. 当第7个字段中存在STRING2时,应提取从最后/到空格开始的字符。
  3. 我写了以下正则表达式:

    (?i)^(?:[^ ]*( {1,2})){6}(?:[a-z]+://[-A-Z0-9.\:]+/)(STRING1/)?(?:[^ /]+/)*(?P<myField>(1)?[^_]+|[^ ]+)
    

    虽然这个正则表达式适用于第一个样本字符串,但对于第二个字符串,它提取“ABC000495835.xyz field8 field9 field10”。

    请告诉我出错的地方以及为什么条件正则表达式的if部分始终匹配。

1 个答案:

答案 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'