我有这个字符串
AC7640 Montreal Trudeau (YUL) La Guardia/New York (LGA) E75 Business (P) Confirmed
我希望它与AC
,7640
,YUL
和LGA
匹配
但是如果最后一个机场不存在,我也想匹配:
AC7640 Montreal Trudeau (YUL) E75 Business (P) Confirmed
AC
,7640
和YUL
我想出了这个正则表达式:
([A-Z]{2}|[A-Z][0-9]|[0-9][A-Z])\s*([0-9]{1,4})(?:.*?\(([A-Z]{3})\)){1,2}
问题是它只匹配两个字符串上的1个机场
我正在使用python flavor
答案 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组:三个大写字母\)
- )
。