正则表达式始终匹配最后一个组子句

时间:2017-05-24 13:54:30

标签: python regex

我有这个字符串

AC7640 Montreal Trudeau (YUL) La Guardia/New York (LGA) E75 Business (P) Confirmed 我希望它与AC7640YULLGA匹配

但是如果最后一个机场不存在,我也想匹配:

AC7640 Montreal Trudeau (YUL) E75 Business (P) Confirmed

AC7640YUL

我想出了这个正则表达式: ([A-Z]{2}|[A-Z][0-9]|[0-9][A-Z])\s*([0-9]{1,4})(?:.*?\(([A-Z]{3})\)){1,2}

问题是它只匹配两个字符串上的1个机场

我正在使用python flavor

1 个答案:

答案 0 :(得分:1)

你需要"展开"由于重复捕获组仅存储最后一次出现的模式:

^([A-Z]{2}|[A-Z][0-9]|[0-9][A-Z])\s*([0-9]{1,4}).*?\(([A-Z]{3})\)(?:.*?\(([A-Z]{3})\))?

请参阅regex demo。另请注意,最后一部分(?:.*?\(([A-Z]{3})\))?附有可选的非捕获组,因此它可以匹配1或0次出现。 ^在开始时使正则表达式引擎仅从字符串的开头搜索。

<强>详情:

  • ^ - 字符串开头
  • ([A-Z]{2}|[A-Z][0-9]|[0-9][A-Z]) - 第1组:两个大写字母或一个超级字母和一个数字或一个数字和一个大写字母
    • \s* - 0+ whitespaces
    • ([0-9]{1,4}) - 第2组:一到四位
  • .*? - 任意0个字符尽可能少到第一个......
  • \( - (
  • ([A-Z]{3}) - 第3组:三个大写字母
  • \) - )
  • (?:.*?\(([A-Z]{3})\))? - 与1或0(可选)匹配的非捕获组:
    • .*? - 任意0个字符尽可能少到第一个......
    • \( - (
    • ([A-Z]{3}) - 第4组:三个大写字母
    • \) - )