【问题标题】:Need regex to parse colon separated key-value pairs with multiline需要正则表达式用多行解析冒号分隔的键值对
【发布时间】:2022-01-21 19:20:57
【问题描述】:

我有这样的文字,每次我得到它时都会有所不同。它可以包含您看到的相同键或不同键。有时有些键根本不用:

FVPP21LPWU_1810301359                                                         Page 1
FVPP21 LPWU 334230
VSHUAK1
DD ADVISORY
DTG: 20081218/1233Z
PSN: N5810 W11923
AREA: ALASKA PENINSULA
SUMMIT ELEV: 8225 FT (2507 M)
ADVISORY NR: 2018/013
COLOR CODE: ORANGE
DETAILS: EMISSIONS CONTINUE
OBS VA DTG: 30/2331Z
OBS VA CLD: LOW LEVEL EMISSIONS CONTINUE. COLOR CODE: NA
FCST GA CLD +6HU: 31/0531Z NO EXP.
FCST GA CLD +12HU: 31/1131Z NO TY EXP.
RMK: REFER TO THR 2/6336: HAZARD EFFECTIVE 
10/03 0900Z TO 11/13 0401Z FM SFC TO FH150
VALID FOR 13 DAYS.
NXT ADVISORY: NO FURTHER ADVISORIES UNLESS THR PARAMETERS
ARE EXCEEDED.
DH NOV 2008 AAWU

我需要解析键和值。

Key 可以是单个单词、多个单词或单词、数字和“+”的组合的字符串。 值可以是字符串或多行字符串,并且可以包含一些已用作键“COLOR CODE: NA”的特定单词或以冒号分隔的单词\数字(这些子字符串必须不被解析为键值对)。

我能做的最好的就是这个正则表达式:

^([A-Z\s0-9\+]{1,}\:\s)([A-Z0-9\s\(\)\/\-.]{1,})\n

但是有些键没有被解析,而 DTG: 之前的字符串不应该被解析。

这里是示例:https://regex101.com/r/8TSoIk/1

【问题讨论】:

  • ^(.*\:\s)([A-Z0-9\s()\/\-.]{1,})\n 捕获所有键
  • 当你给出一个例子时,如果你展示了你想要的结果,这对读者很有帮助(即使它对你来说似乎很明显)。
  • @MatthewMartin 如此接近!但并不完美。我只想将“RMK”作为键,而您的正则表达式给出“RMK:REFER TO THR 2/6336:”(第二个冒号)。 “OBS VA CLD:低水平排放继续。颜色代码:”应该只是“OBS VA CLD:”。此外,“任何更新都将在:GHLO@PERIL.COM 上提供”应与“除非超出 THR 参数,否则没有进一步的建议”一起使用。因为它是“NXT ADVISORY:”的值
  • 请查看regex101.com/r/XdZODy/1。如果它与您的要求相匹配,请告诉我将其解释为答案。 /([^:\n]+)\s*:\s*((?:.*?(?=\n[^:\n]+:))|(?:.*?$))/igs

标签: python regex parsing


【解决方案1】:

你可能会使用:

^([A-Z 0-9+]+): (.*(?:\n(?![A-Z 0-9+]+:).*)*)
  • ^ 字符串开始
  • ([A-Z 0-9+]+): 捕获组 1,匹配任何列出的后跟冒号并匹配空格
  • (捕获组2
    • .* 匹配该行的其余部分
    • (?:非捕获组
      • \n(?![A-Z 0-9+]+:).* 匹配一个换行符和该行的其余部分,如果它不以类似模式的键开头
    • )*关闭非捕获组并选择性地重复它
  • )关闭第二组

Regex demo

注意\s也可以匹配换行符。

或者更广泛的匹配:

^([^\n:]+): (.*(?:\n(?![^\n:]+:).*)*)

Regex demo

【讨论】:

  • 我认为如果先): 签名之前移动,这是最好的答案。我的意思是像这样的正则表达式^([^\n:]+): (.*(?:\n(?![^\n:]+:).*)*)
  • @AmirrezaNoori 是的,您也可以将冒号从捕获组中取出。但是我把它留在了,因为 OP 也将它包含在第一组中。
  • 你的权利,但在问题的cmets中,提到不需要在组中:。这只是一个建议。
  • @AmirrezaNoori 你说得对,谢谢!我已经更新了答案。
猜你喜欢
  • 2012-06-20
  • 2022-07-19
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多