我有一大堆化学数据,其中包含以下条目:
1. 2,4-D, Benzo(a)pyrene, Dioxin, PCP, 2,4,5-TP
2. Lead,Paints/Pigments,Zinc
我有一个功能正确地将第一个条目拆分为: ['2,4-D','苯并(a)芘','二恶英','PCP','2,4,5-TP']
基于','作为分隔符。对于第二个条目,','将不起作用。但是,如果我可以轻松拆分任何包含','的字符串,两侧只有两个非数字字符,我就可以解析所有条目,如第二个,而不会拆分化学品在第一个条目中,名称中的数字用逗号分隔(即2,4,5-TP)。
有一种简单的pythonic方式吗?
答案 0 :(得分:2)
我根据@ eph的回答解释了一下:
import re
data_list = ['2,4-D, Benzo(a)pyrene, Dioxin, PCP, 2,4,5-TP', 'Lead,Paints/Pigments,Zinc']
for d in data_list:
print re.split(r'(?<=\D),\s*|\s*,(?=\D)',d)
re.split(pattern, string)会按正则表达式模式的出现拆分 string 。 (如果你不熟悉正则表达式,请阅读Regex Quick Start。)
(?<=\D),\s*|\s*,(?=\D)
由两部分组成:(?<=\D),\s*
和\s*,(?=\D)
。每个单位的含义:
|
是OR运算符。 \D
匹配不是数字的单个字符。\s
匹配空格字符(包括制表符和换行符)。,
匹配字符&#34;,&#34;。*
尝试将前一个令牌匹配零次或多次。因此,\s*
表示空白可以出现零次或多次。 (见Repetition with Star and Plus)(?<= ... )
和(?= ...)
是lookbebind and lookahead assertions。
例如,q(?=u)
匹配后跟q
的{{1}},而不会匹配u
部分。 因此,u
匹配前面有零个或多个空格的\s*,(?=\D)
,后跟非数字字符。同样,,
匹配前面带有非数字字符且后跟零个或多个空格的(?<=\D),\s*
。整个正则表达式会找到满足任一情况的,
,这相当于您的要求:&#39;,&#39;只有两个非数字字符。
正则表达式的一些有用工具:
答案 1 :(得分:1)
使用正则表达式和lookbehind / lookahead断言
>>> re.split(r'(?<=\D\D),\s*|,\s*(?=\D\D)', s)
['2,4-D', 'Benzo(a)pyrene', 'Dioxin', 'PCP', '2,4,5-TP']
答案 2 :(得分:0)
>>> s1 = "2,4-D, Benzo(a)pyrene, Dioxin, PCP, 2,4,5-TP"
>>> s2 = "Lead,Paints/Pigments,Zinc"
>>> import re
>>> res1 = re.findall(r"\s*(.*?[A-Za-z])(?:,|$)", s1)
>>> res1
['2,4-D', 'Benzo(a)pyrene', 'Dioxin', 'PCP', '2,4,5-TP']
>>> res2 = re.findall(r"\s*(.*?[A-Za-z])(?:,|$)", s2)
>>> res2
['Lead', 'Paints/Pigments', 'Zinc']