我有一个很大的化学数据列表,其中包含如下条目:
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方法可以做到这一点?
最佳答案
我根据@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)将按正则表达式模式的出现次数分割字符串。 (如果您不熟悉正则表达式,请阅读 Regex Quick Start。)
(?<=\D),\s*|\s*,(?=\D)
由两部分组成:(?<=\D),\s*
和\s*,(?=\D)
。各单位含义:
- 中间
|
是或运算符。 -
\D
匹配非数字的单个字符。 -
\s
匹配空白字符(包括制表符和换行符)。 -
,
匹配字符“,”。 -
*
尝试匹配前面的标记零次或多次。因此,\s*
表示空白可以出现零次或多次。 (参见Repetition with Star and Plus) -
(?<= ... )
和(?= ...)
是lookbebind and lookahead assertions 。 例如,q(?=u)
匹配q
后面跟着u
,而不做u
比赛的一部分。
因此,\s*,(?=\D)
匹配,
前面有零个或多个空格,后面是非数字字符。同样,(?<=\D),\s*
匹配,
前面是非数字字符,后面是零个或多个空格。整个正则表达式将找到 ,
满足任一情况,相当于您的要求:',' 两侧只有两个非数字字符。
一些有用的正则表达式工具:
- Regex Cheat Sheet
- 在线正则表达式测试器:regex101 (对您的正则表达式进行树结构解释)
关于python - 当分隔符两侧的字符不是数字时,在 python 中分割字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34082584/