【问题标题】:Regex match - Python - any amount of characters正则表达式匹配 - Python - 任意数量的字符
【发布时间】:2020-12-01 08:10:46
【问题描述】:

找不到与我正在寻找的示例相似的示例。

我正在尝试在 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)

但是,我也想在发出多个时捕获它:

  • 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)?

【问题讨论】:

    标签: python regex parsing string-parsing


    【解决方案1】:

    我会使用这样的东西:

    r'((\d{4})-(AAL|ACE|AEA|AGL|ANE|ANM|ASO|ASW|AWP|WTE|WTW)-([^-]+)-(OE|NRA))'
    

    当作为re.findall() 的键时,它应该生成一个嵌套列表,其中外部列表​​包含每个大匹配项,内部列表包含每个匹配项中的四个子匹配项(作为元素 1、2、元组的 3 和 4;元素 0 是完整的单一模式匹配)。

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

    【讨论】:

      【解决方案2】:

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

      您可以通过向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

      【讨论】:

      • ..或(A(?:AL|CE|EA|GL|N[EM]|S[OW]|WP)|WT[EW]),快速计算不以'A'开头的三字符字符串。
      猜你喜欢
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      相关资源
      最近更新 更多