在Python中拆分带有多个分隔符的字符串

gt5*_*65k 435 python string split delimiter

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

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

示例字符串:

"b-staged divinylsiloxane-bis-benzocyclobutene [124221-30-3], mesitylene [000108-67-8]; polymerized 1,2-dihydro-2,2,4- trimethyl quinoline [026780-96-1]"
Run Code Online (Sandbox Code Playgroud)

应该拆分成包含以下内容的列表:

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

Jon*_*han 721

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

import re
re.split('; |, ',str)
Run Code Online (Sandbox Code Playgroud)

更新:
发表评论后:

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

  • 我想知道为什么(常规)拆分只是不能接受列表,这似乎是一种更明显的方式,而不是在一行中编码多个选项. (51认同)
  • 只是添加一点,而不是添加一堆或"|" 您可以执行以下操作的符号:re.split('[;,.\ - \%]',str),在[]内部放置要分割的所有字符. (13认同)
  • 我更喜欢将它写成:re.split(r'; |,\ s',a)将''(空格字符)替换为'\ s'(空格),除非空格字符是严格要求. (10认同)
  • 如上所述,使用一些RegEx之类的东西是值得的.所以试图用一个字符串拆分.会拆分每个角色.你需要逃脱它.\. (5认同)
  • 有没有办法保留输出中的分隔符但将它们组合在一起?我知道执行 `re.split('(; |, |\*|\n)', a)` 将保留分隔符,但如何将后续分隔符合并到输出列表中的一个元素中? (3认同)

Joe*_*Joe 187

做一个str.replace('; ', ', ')然后一个str.split(', ')

  • 假设你有5个分界符,你必须遍历你的字符串5次 (48认同)
  • 如果你有少量的分隔符并且是perormance约束的,那么`replace`技巧是最快的.比regexp快15倍,比val.split(...)`生成器中的嵌套`快近2倍. (17认同)
  • +1; 非常具体和重点,不是通用的.哪个通常更好. (15认同)
  • 这表明了你对这个问题的不同看法.我认为这是一个伟大的."如果你不知道直接答案,请结合你所知道的事情来解决它". (15认同)
  • 性能并不总是一个问题。我的用例是处理来自人类输入的命令行参数的输入,因此这个解决方案非常理想。我也尽可能避免使用正则表达式。创建很容易,阅读却很困难。 (4认同)
  • 这对性能非常不利 (2认同)
  • 当然,如果您有多个分隔符,则使用 re.split() 会获得更好的性能,但这是解决问题的一种非常聪明且易于理解的方法。 (2认同)

Kos*_*Kos 98

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

>>> import re
>>> delimiters = "a", "...", "(c)"
>>> example = "stackoverflow (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?"]
Run Code Online (Sandbox Code Playgroud)

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

以下是此解决方案作为复制粘贴乐趣的功能:

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

如果您要经常使用相同的分隔符进行拆分,请事先编译正则表达式,如描述和使用RegexObject.split.

  • +1这是最安全和可扩展的解决方案. (3认同)
  • @ Mausy5043在Python中没有内置的`split`,也许你把它与`str.split`方法混淆了? (3认同)

Pau*_*aul 54

回应Jonathan上面的回答,这似乎只适用于某些分隔符.例如:

>>> 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']
Run Code Online (Sandbox Code Playgroud)

通过将分隔符放在方括号中,它似乎更有效.

>>> re.split('[- :]', b)
['1999', '05', '03', '10', '37', '00']
Run Code Online (Sandbox Code Playgroud)

  • 它适用于您指定的所有分隔符.` - :`的正则表达式恰好匹配` - :`,因此不会拆分日期/时间字符串.`[ - :]`的正则表达式匹配`-`,`<space>`或`:`,从而拆分日期/时间字符串.如果你只想在`-`和`:`上拆分那么你的正则表达式应该是`[ - :]`或` - |:`,如果你想拆分`-`,`<space>`和`:`那么你的正则表达式应该是`[ - :]`或` - | |:`. (12认同)
  • @alldayremix我看到了我的错误:我错过了你的正则表达式包含OR |的事实.我盲目地将它识别为所需的分隔符. (3认同)

Joc*_*zel 28

这是正则表达式的样子:

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)
Run Code Online (Sandbox Code Playgroud)