使用正则表达式拆分逗号,空格或分号分隔的字符串

时间:2012-03-22 01:05:04

标签: python regex

我使用正则表达式[,; \ s] +来分割逗号,空格或分号分隔的字符串。如果字符串末尾没有逗号,则可以正常工作:

>>> p=re.compile('[,;\s]+')
>>> mystring='a,,b,c'
>>> p.split(mystring)
['a', 'b', 'c']

当字符串末尾有逗号时:

>>> mystring='a,,b,c,'
>>> p.split(mystring)
['a', 'b', 'c', '']

我希望这种情况下的输出为['a','b','c']。

有关正则表达式的任何建议吗?

3 个答案:

答案 0 :(得分:7)

这是一种非常低技术的东西应该仍然有用:

mystring='a,,b,c'
for delim in ',;':
    mystring = mystring.replace(delim, ' ')
results = mystring.split()

<强> PS : 虽然正则表达式非常有用,但我强烈建议再考虑一下它是否适合这里的工作。虽然我不确定编译的正则表达式的确切运行时是什么(我最多想的是O(n ^ 2)),但它绝对不比O(n)快,后者是{{1}的运行时间}。因此,除非您需要使用正则表达式的原因不同,否则应使用此解决方案进行设置

答案 1 :(得分:6)

尝试:

str = 'a,,b,c,'
re.findall(r'[^,;\s]+', str)

答案 2 :(得分:3)

嗯,技术上的分裂做了。在a,,b,c中,它会在,,,上分开,留下“a”,“b”和“c”。在a,,b,c,中,它会分为,,,和最后,(因为它们都匹配正则表达式!)。这些delmiters周围的字符串是“a”,“b”,“c”和“”(在最后一个逗号和字符串结尾之间)。

你可以通过几种方法来规避这一点。

  • 只有在字符串的开头或结尾有分隔符时才会出现空字符串,因此在使用str.strip拆分之前,请删除其中任何一个[,;\s]

    p.split(mystring.strip(',; \t\r\n'))
    
  • 使用您喜欢的任何方法删除分割后的空字符串

    res = p.split(mystring)
    [r for r in res if r != '']
    # another option
    filter(None,res)
    
  • 更好的是,因为您知道只会将空字符串作为拆分字符串的第一部分或最后一部分(例如,a,b,ca,b,c,),所以不要迭代通过整个分裂:

    res = p.slit(mystring)
    # this one relies on coercing logical to numbers:
    # if res[0] is '' it'll be 1:X, otherwise it'll be 0:X,
    #  where X is len(res) if res[-1] is not '', and len(res)-1 otherwise.
    res[ res[0]=='':(len(res)-(res[-1]==''))]