我需要在长文本字符串中找到几个可选变量。这似乎是一个简单的问题,但我希望有一个比我得到的更简单的解决方案。
我需要找到前 10 个字符(简单)12345abcde 以及 ADD 部分中的变量 AA1ab12 和 AA2abc123(如果存在):
12345abcdeADDAA1ab12
12345abcdeADDxyzAA1ab12
12345abcdeADDxyzAA1ab12xyz
12345abcdeADDAA2abc123
12345abcdeADDAA1ab12xyAA2abc123
12345abcdeADDAA1ab12xAA2abc123y
12345abcdeADDxAA1ab12xAA2abc123y
12345abcdeADDxAA2abc123xAA1ab12y
这是一个简化的示例和解决方案,但恐怕需要很多步骤才能应用并导致性能问题:
我尝试在
(^(.{10})(?:(?:ADD).*?(AA1.{4})?.*?(AA2.{6})?.*?)?$)
之间添加带有惰性字符串的所有可选变量,但其他一些选项未成功。
也许我错过了正则表达式功能
感谢您的帮助!
“... - 真正的应用问题:从天气 NOAA ISD 原始格式数据集中获取 8 个可选变量:...”
您可以通过断言结束值是来捕获变量数据,
$
[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'}