正则表达式-查找几个可选变量

问题描述 投票:0回答:1

我需要在长文本字符串中找到几个可选变量。这似乎是一个简单的问题,但我希望有一个比我得到的更简单的解决方案。

我需要找到前 10 个字符(简单)12345abcde 以及 ADD 部分中的变量 AA1ab12 和 AA2abc123(如果存在):

12345abcdeADDAA1ab12
12345abcdeADDxyzAA1ab12
12345abcdeADDxyzAA1ab12xyz
12345abcdeADDAA2abc123
12345abcdeADDAA1ab12xyAA2abc123
12345abcdeADDAA1ab12xAA2abc123y
12345abcdeADDxAA1ab12xAA2abc123y
12345abcdeADDxAA2abc123xAA1ab12y

这是一个简化的示例和解决方案,但恐怕需要很多步骤才能应用并导致性能问题:

我尝试在

(^(.{10})(?:(?:ADD).*?(AA1.{4})?.*?(AA2.{6})?.*?)?$)
之间添加带有惰性字符串的所有可选变量,但其他一些选项未成功。

也许我错过了正则表达式功能

感谢您的帮助!

regex regex-group
1个回答
0
投票

“... - 真正的应用问题:从天气 NOAA ISD 原始格式数据集中获取 8 个可选变量:...”

您可以通过断言结束值是来捕获变量数据,

  • 文本“REM”,用于“备注数据部分”,第 116 页。
  • 线路结束,
    $
  • 或者,另一个数据类型
    [A-Z]{2}\d
(AA1|AJ1|GF1|GH1|GM1|OC1|OA1|OD1)(.+?)(?=REM|$|[A-Z]{2}\d)

这是一个使用 Python 的示例。

p = r'(AA1|AJ1|GF1|GH1|GM1|OC1|OA1|OD1)(.+?)(?=REM|$|[A-Z]{2}\d)'
l = [{y.group(1): y.group(2)} for x in s for y in re.finditer(p, x)]
[print(x) for x in l]

输出

{'GF1': '07991071091004501999031'}
{'OA1': '99901431'}
{'OA1': '99901431'}
{'GF1': '07991021061002501031999'}
{'AJ1': '00039199999999'}
{'GF1': '08991061071004501999999'}
{'OA1': '99901381'}
{'AA1': '06999999'}
{'GF1': '99999081999003601999999'}
© www.soinside.com 2019 - 2024. All rights reserved.