我正在尝试使用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/