在Python中使用多个分隔符拆分字符串[重复]

Posted

技术标签:

【中文标题】在Python中使用多个分隔符拆分字符串[重复]【英文标题】:Split string with multiple delimiters in Python [duplicate] 【发布时间】:2011-06-27 06:50:16 【问题描述】:

我在网上找到了一些答案,但是我没有使用正则表达式的经验,我相信这是这里需要的。

我有一个字符串需要用 ';' 来分割要么 ', ' 也就是说,它必须是分号或逗号后跟空格。没有尾随空格的单个逗号应保持不变

示例字符串:

"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]') 

【问题讨论】:

【参考方案1】:

对于任何可迭代的分隔符,这是一种使用正则表达式的安全方法:

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

re.escape 允许自动构建模式并很好地转义分隔符。

这是一个让您享受复制粘贴乐趣的解决方案:

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

如果您要经常使用相同的分隔符进行拆分,请按照所述预先编译您的正则表达式并使用RegexObject.split


如果您想保留字符串中的原始分隔符,您可以更改正则表达式以使用 lookbehind assertion:

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

(将 ?&lt;= 替换为 ?= 以将分隔符附加到右侧,而不是左侧)

【讨论】:

【参考方案2】:

响应乔纳森的上述回答,这似乎只适用于某些定界符。例如:

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

>>> b='1999-05-03 10:37:00'
>>> re.split('- :', b)
['1999-05-03 10:37:00']

将分隔符放在方括号中似乎更有效。

>>> re.split('[- :]', b)
['1999', '05', '03', '10', '37', '00']

【讨论】:

它适用于您指定的所有分隔符。 - : 的正则表达式与 - : 完全匹配,因此不会拆分日期/时间字符串。 [- :] 的正则表达式匹配 -&lt;space&gt;:,从而拆分日期/时间字符串。如果您只想在-: 上拆分,那么您的正则表达式应该是[-:]-|:,如果您想在-&lt;space&gt;: 上拆分,那么您的正则表达式应该可以是[- :]-| |: @alldayremix 我明白了我的错误:我错过了您的正则表达式包含 OR | 的事实。我盲目地将其识别为所需的分隔符。【参考方案3】:

幸运的是,Python 有这个内置的 :)

import re
re.split('; |, ',str)

更新:根据您的评论:

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

【讨论】:

我更愿意将其写成:re.split(r';|,\s', a) 将 ' ' (空格字符)替换为 '\s' (空格),除非空格字符是一个严格的要求。 我想知道为什么(常规)拆分不能接受列表,这似乎是一种更明显的方式,而不是在一行中编码多个选项。 它使用了一些类似于上面提到的 RegEx 的东西是毫无价值的。所以试图用 .将拆分每个字符。你需要逃避它。 \. 只是添加一点,而不是添加一堆或“|”您可以执行以下操作: re.split('[;,.\-\%]',str),其中 [ ] 内放置所有要分割的字符。 有没有办法在输出中保留分隔符但将它们组合在一起?我知道 re.split('(; |, |\*|\n)', a) 会保留分隔符,但是如何将后续分隔符合并到输出列表中的一个元素中?【参考方案4】:

这就是正则表达式的样子:

import re
# "semicolon or (a comma followed by a space)"
pattern = re.compile(r";|, ")

# "(semicolon or a comma) followed by a space"
pattern = re.compile(r"[;,] ")

print pattern.split(text)

【讨论】:

【参考方案5】:

执行str.replace('; ', ', '),然后执行str.split(', ')

【讨论】:

+1;非常具体和切中要害,不是通用的。这通常更好。 假设你有 5 个分隔符,你必须遍历你的字符串 5 次 这对性能非常不利 这显示了你对这个问题的不同看法。我认为这是一个伟大的。 “如果您不知道直接的答案,请使用您所知道的组合来解决它”。 如果您的分隔符数量很少并且性能受限,replace 技巧是最快的。比正则表达式快 15 倍,比嵌套的 for in val.split(...) 生成器快近 2 倍。

以上是关于在Python中使用多个分隔符拆分字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在c#中拆分逗号分隔多个字符串[重复]

如何在python中拆分具有多个分隔符的字符串? [复制]

在拆分中使用多个分隔符[重复]

用“(”和“)”拆分字符串并保留分隔符(Python)[重复]

在Python中拆分具有未知数量空格的字符串作为分隔符

如何使用分隔符数组在 Java 中使用多个分隔符拆分字符串? [复制]