在Python中使用多个分隔符拆分字符串
我在网上找到了一些答案,但我没有使用正则表达式的经验,我相信这里需要正则表达式 我有一个字符串,它需要被一个“;”分开或“,” 也就是说,它必须是分号或逗号后跟空格。不带尾随空格的单个逗号应保持不变 示例字符串:在Python中使用多个分隔符拆分字符串,python,string,split,delimiter,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 [026
"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]')
执行
str.replace(“;”,“,”)
然后执行str.split(“,”)
这就是正则表达式的外观:
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)
幸运的是,Python具有以下内置功能:) 更新:
以下是您的评论:
>>> a='Beautiful, is; better*than\nugly'
>>> import re
>>> re.split('; |, |\*|\n',a)
['Beautiful', 'is', 'better', 'than', 'ugly']
以下是使用正则表达式对任何iterable分隔符的安全方法:
>>> 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?"]
允许自动构建模式,并很好地转义分隔符
以下是此解决方案的一个功能,可让您享受粘贴副本的乐趣:
def split(delimiters, string, maxsplit=0):
import re
regexPattern = '|'.join(map(re.escape, delimiters))
return re.split(regexPattern, string, maxsplit)
如果要经常使用相同的分隔符进行拆分,请事先编译正则表达式,如所述并使用
如果要在字符串中保留原始分隔符,可以将正则表达式更改为使用:
>>重新导入
>>>分隔符=“a”、“…”、“(c)”
>>>示例=“stackoverflow(c)太棒了……不是吗?”
>>>regexpatern='|'。join('(?响应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']
通过将分隔符放在方括号中,它似乎工作得更有效
>>> re.split('[- :]', b)
['1999', '05', '03', '10', '37', '00']
谢谢,我的想法是正确的,我只是不知道如何分割分隔符,现在我看到您使用了|符号。+1;非常具体,切中要害,而不是泛型。这通常更好。假设您有5个delimeters,您必须遍历字符串5倍,这对性能非常不利。这显示了您对这个问题的不同看法。我认为这是一个很好的方法。“如果你不知道一个直接的答案,使用你知道的东西组合来解决它”。如果你有少量的分隔符并且受perormance约束,replace
技巧是所有技巧中最快的。对于in-val.split(…),它比regexp快15倍,比nested快近2倍
生成器。它适用于您指定的所有分隔符。-:
的正则表达式与-:
完全匹配,因此不会拆分日期/时间字符串。[-:]的正则表达式
匹配-
、
或:
,从而拆分日期/时间字符串。如果只希望在-
和:
上拆分,则正则表达式应为[-:]
或-|:
,如果要在-
、
和:
上拆分,则正则表达式应为[-:]
或-| |:
@alldayremix我看到了我的错误:我错过了您的正则表达式包含或的事实。我盲目地将它标识为所需的分隔符。谢谢,我需要我的用例的括号。@snakedoctor不是这个网站的工作方式。其他解决方案都有它们的优点。还有谁将是“唯一的仲裁人?”[最佳答案]真相”?导入re words=re.split(r'\W+',text)+1这是最安全和可扩展的解决方案。请注意,使用def split()
将重载python函数split()
@Mausy5043 Python中没有内置的split
,也许你把它与str.split
方法混淆了?@Kos当然了!!在保持新拆分列表中的分隔符的同时,怎么能做到这一点呢?我更愿意把它写成:re.split(r';|,\s',a),用“\s”(空白)替换“”(空格字符)除非空格字符是一个严格的要求。我想知道为什么(常规)split无法接受列表,这似乎是一种更明显的方式,而不是在一行中编码多个选项。使用上面提到的一些类似正则表达式的东西是毫无意义的。因此尝试使用拆分字符串将拆分每个字符。您需要对其进行转义。\。只需添加一点,而不是添加一堆对于“|”符号,您可以执行以下操作:re.split(“[;,.\-\%]”,str),其中在[]内放置所有要拆分的字符。是否有方法在输出中保留分隔符,但将它们组合在一起?我知道执行re.split(“;”,| \*\n)”,a)
将保留分隔符,但如何将后续分隔符合并到输出列表中的一个元素中?
>>> 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']