Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用多个分隔符拆分字符串_Python_String_Split_Delimiter - Fatal编程技术网

在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']