正则表达式匹配 - Python - 任意数量的字符

Regex match - Python - any amount of characters

找不到与我要查找的示例相似的示例。

我正在尝试在 FAA 航空航行通告中获取 ASN 编号。下面的示例:

示例文本:

2019-AWP-7268-OE

正则表达式匹配 (findall):

\d{4}-(?:AAL|ACE|AEA|AGL|ANE|ANM|ASO|ASW|AWP|WTE|WTW)-(?:\d{3,6})-(?:OE|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() 的键给出时,应该生成一个嵌套列表,其中外部列表​​包含每个大匹配项,内部列表包含每个匹配项中的四个 sub-matches (分别作为元组的元素 1、2、3 和 4;元素 0 是完整的单一模式匹配)。

此后,您可以执行另一次正则表达式操作迭代或一些其他操作,特别是在匹配的 任何文本 部分,以准确隔离哪些 ID 或您想要的任何内容正在处理。

要匹配任何文本,您还可以使用.*,它将匹配到行尾,然后回溯以匹配最后一次出现的- 然后将匹配 OENRA

您可以通过向字符 class 添加一些字符来缩短交替,例如 A[AG]L 以匹配 AALAGL

请注意,您不需要 (?:\d{3,6})

周围的非捕获组
^(\d{4})-(ACE|AEA|A[AG]L|AN[EM]|AS[WO]|AWP|WT[EW])-(\d{3,6}.*)-(OE|NRA)$

Regex demo

如果没有锚点,您可以使量词不贪婪并使用单词边界:

\b(\d{4})-(ACE|AEA|A[AG]L|AN[EM]|AS[WO]|AWP|WT[EW])-(\d{3,6}.*?)-(OE|NRA)\b

Regex demo