我正在尝试使用Regex将这种自由文本转换为字典。


  铝胺A(12000 UI / kg),硫胺素D3(1 200 UI / kg),烟酸E(70 mg / kg),锌[锌,锌](70 mg / kg),锌[锌酸铝盐,水合物(45毫克/千克),铜[硫酸铜(II),五水合物](10毫克/千克),碘[碘酸钙,无水钙] ](2毫克/千克),硒(钠钠)(0.2毫克/千克),cyaobactin12(0.2%)


想法是抓住关键和价值


关键:胺A
值:12 000 UI / kg


要么


关键:铜[硫酸铜(II),五水合物]
值:10毫克/公斤


我尝试了一些选项来实现此文本转换:

第一种方法:直接使用正则表达式(()\((\d*\.*\s*\d*\s*)(UI\/kg|mg\/kg|%)\)),但是我只能正确地隔离值而不是键。

第二种方法:


用这种正则表达式(\[.*),(.*\]消除括号中的',',它不能精确捕获[硫酸二甲酯(II),五水合物]或[硫酸碘钙**,**酸酐] ]


沿“,”拆分,使列表看起来像列表[“ alamine A(12000 UI / kg)”,“ thiamine D3(1200 UI / kg)” ...]
3。对于列表中的每个元素,请使用更简单的正则表达式作为第一种方法(.*)\((\d*\.*\s*\d*\s*)(UI\/kg|mg\/kg|%)\))



我应该如何进行?

最佳答案

让我们从更简单的部分开始:值。
这是放在括号中的内容:(?P<value>\([^)]+\))

(?P<value> # Capturing "value" group
  \(       # Matches an opening parentheses
  [^)]+    # Matches one or more non ")" characters
  \)       # Matches a closing parentheses
)


完成后,让我们处理密钥。
这里的一点是,密钥可能包含一些放在方括号中的文本。
那么它是任何非([字符,并且后跟方括号中的任何内容:(?P<key>[^[(]+(?:\[[^]]+\])?)

(?P<key>  # Capturing "key" group
  [^[(]+  # One or more non "(" or "[" characters
  (?:     # Non-capturing group
    \[    # An opening bracket
    [^]]+ # One or more non "]" characters
    \]    # A closing bracket
  )?      # Non-capturing group made optional
)


工作即将完成。
我们将在两个组之间添加一个\s作为它们之间的分隔符。
最后,让我们处理序列分隔符:(?:(?<=,\s)|^)

(?:        # Non-capturing group
  (?<=,\s) # Either preceded by a coma and a space
  |^       # Or alternatively beginning the string
)


现在放在一起:(?:(?<=,\s)|^)(?P<key>[^[(]+(?:\[[^]]+\])?)\s(?P<value>\([^)]+\))

关于python - 使用正则表达式将自由文本解析为字典,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52656581/

10-12 23:11