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

标签 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方法可以做到这一点?

最佳答案

我根据@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*匹配,前面是非数字字符,后面是零个或多个空格。整个正则表达式将找到 ,满足任一情况,相当于您的要求:',' 两侧只有两个非数字字符

一些有用的正则表达式工具:

关于python - 当分隔符两侧的字符不是数字时,在 python 中分割字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34082584/

相关文章:

javascript - 如何使用从 DOM 检索到的值来拆分数组

java - 字符串不能改变。但是int、char是可以改变的

java - 从文件中读取,分割行并存储在数组中JAVA

python - 如何通过 docx 库或 xml 将单元格文本包装在表格中?

python - 如何使用FLANN进行标记和聚类?

php - 如何使用 php 搜索文本 if ($text contains "World")

c - 将字符串直接传递给函数

java - 将文件输入以逗号分割成Java数组,并重新写入文件

python - 函数如何访问自己的属性?

python - python中余弦的高效计算