在Python中用多个分隔符分割字符串

788 投票
5 回答
1466762 浏览
提问于 2025-04-16 11:50

我在网上找到了一些答案,但我对正则表达式没有经验,我觉得这里可能需要用到它。

我有一个字符串,需要根据';'或者', '来进行分割。也就是说,它必须是一个分号或者是一个后面跟着空格的逗号。没有后面空格的单独逗号应该保持不变。

示例字符串:

"b-staged divinylsiloxane-bis-benzocyclobutene [124221-30-3], mesitylene [000108-67-8]; polymerized 1,2-dihydro-2,2,4- trimethyl quinoline [026780-96-1]"

应该被分割成一个包含以下内容的列表:

('b-staged divinylsiloxane-bis-benzocyclobutene [124221-30-3]' , 'mesitylene [000108-67-8]', 'polymerized 1,2-dihydro-2,2,4- trimethyl quinoline [026780-96-1]') 

5 个回答

190

这里有一种安全的方法,可以处理任何可迭代的分隔符,使用正则表达式:

>>> import re
>>> delimiters = "a", "...", "(c)"
>>> example = "stackoverflow (c) is awesome... isn't it?"
>>> regex_pattern = '|'.join(map(re.escape, delimiters))
>>> regex_pattern
'a|\\.\\.\\.|\\(c\\)'
>>> re.split(regex_pattern, example)
['st', 'ckoverflow ', ' is ', 'wesome', " isn't it?"]

re.escape 这个函数可以自动生成模式,并且把分隔符处理得很好。

下面是一个函数的实现,方便你复制粘贴:

def split(delimiters, string, maxsplit=0):
    import re
    regex_pattern = '|'.join(map(re.escape, delimiters))
    return re.split(regex_pattern, string, maxsplit)

如果你经常使用相同的分隔符进行拆分,建议提前编译你的正则表达式,像上面描述的那样,然后使用 RegexObject.split


如果你想在字符串中保留原始的分隔符,可以把正则表达式改成使用 前瞻断言

>>> import re
>>> delimiters = "a", "...", "(c)"
>>> example = "stackoverflow (c) is awesome... isn't it?"
>>> regex_pattern = '|'.join('(?<={})'.format(re.escape(delim)) for delim in delimiters)
>>> regex_pattern
'(?<=a)|(?<=\\.\\.\\.)|(?<=\\(c\\))'
>>> re.split(regex_pattern, example)
['sta', 'ckoverflow (c)', ' is a', 'wesome...', " isn't it?"]

(把 ?<= 替换成 ?=,这样就可以把分隔符放在右边,而不是左边)

502

先用 str.replace('; ', ', ') 把字符串中的分号和空格替换成逗号和空格,然后再用 str.split(', ') 把这个字符串按照逗号和空格分开。

1285

幸运的是,Python自带这个功能 :)

import re

# Regex pattern splits on substrings "; " and ", "
re.split('; |, ', string_to_split)

更新:

根据你的评论:

>>> string_to_split = 'Beautiful, is; better*than\nugly'
>>> import re
>>> re.split('; |, |\*|\n', string_to_split)
['Beautiful', 'is', 'better', 'than', 'ugly']

撰写回答