当分隔符两侧的字符不是数字时,在python中拆分字符串

时间:2015-12-04 06:56:03

标签: python string split

我有一大堆化学数据,其中包含以下条目:

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方式吗?

3 个答案:

答案 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']