如何解决正则表达式匹配-Python-任意数量的字符
找不到看起来像我要找的示例。
我正在尝试在FAA航空NOTAM中捕获ASN编号。下面的示例:
示例文本:
2019-AWP-7268-OE
正则表达式匹配(findall):
\d{4}-(?:AAL|ACE|AEA|AGL|ANE|ANM|ASO|ASW|AWP|WTE|WTW)-(?:\d{3,6})-(?:OE|NRA)
但是,我也想在发布多个时捕获它:
- 2019-AWP-659直通662-NRA
- 2019-AWP-3823 / 3825-NRA
- 2019-AWP-4593 / 4594/4595 / 4596-NRA
- 2019-ASW-4791,4794直通4796,4798直通4800-NRA
我陷入了尝试创建一个表达式的过程,该表达式中除表达式之外的任何数量的字符都以OE / NRA结尾。有什么方法可以匹配年份(2019),地区(ASW | AWP),任何文本(3823/3825),然后键入(OE | NRA)?
解决方法
我会用这样的东西:
r'((\d{4})-(AAL|ACE|AEA|AGL|ANE|ANM|ASO|ASW|AWP|WTE|WTW)-([^-]+)-(OE|NRA))'
,将其作为re.findall()
的键时,应产生一个嵌套列表,其中外部列表包含每个大匹配项,内部列表包含每个匹配项中的四个子匹配项(作为元素1,元组的2、3和4;元素0是完整的单个模式匹配)。
此后,您可以对正则表达式操作或某些其他操作进行另一次迭代,特别是在匹配项的任何文本部分上,以准确隔离要处理的ID或其他内容。
,要匹配任何文本,您还可以使用.*
,它将匹配到行尾,然后回溯以匹配-
的最后一次出现,并且然后匹配OE
或NRA
您可以通过向A[AG]L
之类的字符类中添加一些字符来匹配AAL
或AGL
来缩短转换间隔
请注意,您不需要(?:\d{3,6})
周围的非捕获组
^(\d{4})-(ACE|AEA|A[AG]L|AN[EM]|AS[WO]|AWP|WT[EW])-(\d{3,6}.*)-(OE|NRA)$
没有锚,您可以使量词不贪心并使用单词边界:
\b(\d{4})-(ACE|AEA|A[AG]L|AN[EM]|AS[WO]|AWP|WT[EW])-(\d{3,6}.*?)-(OE|NRA)\b
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。