Python用括号分割字符串

时间:2013-06-27 20:11:39

标签: python string split

我刚才问了一个问题(Python splitting unknown string by spaces and parentheses),这个问题很有效,直到我不得不改变自己的思维方式。我还没有掌握正则表达式,所以我需要一些帮助。

如果用户键入以下内容:

new test (test1 test2 test3) test "test5 test6"

我希望它看起来像变量的输出,如下所示:

["new", "test", "test1 test2 test3", "test", "test5 test6"]

换句话说,如果它是由空格分隔的一个单词,则将其与下一个单词分开,如果它在括号中,则将括号中的整个单词组拆分并删除它们。同样适用于引号。

我目前使用的代码不符合上述标准(来自上面链接中的答案):

>>>import re
>>>strs = "Hello (Test1 test2) (Hello1 hello2) other_stuff"
>>>[", ".join(x.split()) for x in re.split(r'[()]',strs) if x.strip()]
>>>['Hello', 'Test1, test2', 'Hello1, hello2', 'other_stuff']

这很有效,但如果你有这个问题就有问题:

strs = "Hello Test (Test1 test2) (Hello1 hello2) other_stuff"

它将Hello和Test结合为一个而不是两个。

它也不允许同时使用括号和引号分割。

5 个答案:

答案 0 :(得分:4)

答案很简单:

re.findall('\[[^\]]*\]|\([^\)]*\)|\"[^\"]*\"|\S+',strs)

答案 1 :(得分:1)

您的问题没有明确定义。

您对规则的描述是

  

换句话说,如果它是由空格分隔的一个单词,则将其拆分   从下一个单词开始,如果它在括号中,则拆分整个组   括号中的单词并删除它们。逗号也一样。

我猜你用逗号表示引号==引号。

然后用这个

strs = "Hello (Test1 test2) (Hello1 hello2) other_stuff"

你应该得到那个

["Hello (Test1 test2) (Hello1 hello2) other_stuff"]

因为所有内容都被引号括起来。最有可能的是,你想要不用处理最大的引号。

我提出这个,虽然机器人丑陋

import re, itertools
strs = raw_input("enter a string list ")

print [ y for y in list(itertools.chain(*[re.split(r'\"(.*)\"', x) 
        for x in re.split(r'\((.*)\)', strs)])) 
        if y <> '']

>>> 
enter a string list here there (x y ) thereagain "there there"
['here there ', 'x y ', ' thereagain ', 'there there']

答案 2 :(得分:1)

这正在做你期望的事情

import re, itertools
strs = raw_input("enter a string list ")

res1 = [ y for y in list(itertools.chain(*[re.split(r'\"(.*)\"', x) 
        for x in re.split(r'\((.*)\)', strs)])) 
        if y <> '']

set1 = re.search(r'\"(.*)\"', strs).groups()
set2 = re.search(r'\((.*)\)', strs).groups()

print [k for k in res1 if k in list(set1) or k in list(set2) ] 
   + list(itertools.chain(*[k.split() for k in res1 if k 
   not in set1 and k not in set2 ]))

答案 3 :(得分:0)

这正在推动正则表达式可以做的事情。请考虑使用pyparsing。它做递归下降。对于此任务,您可以使用:

from pyparsing import *
import string, re

RawWord = Word(re.sub('[()" ]', '', string.printable))
Token = Forward()
Token << ( RawWord | 
           Group('"' + OneOrMore(RawWord) + '"') |
           Group('(' + OneOrMore(Token) + ')') )
Phrase = ZeroOrMore(Token)

Phrase.parseString(s, parseAll=True)

这对于奇怪的空格很有用,并且可以处理嵌套的括号。它比大型正则表达式更具可读性,因此更容易调整。

我意识到你早已解决了问题,但对于像这样的问题,这是google排名最高的网页之一,而pyparsing则是一个知名度不高的图书馆。

答案 4 :(得分:0)

对于python 3.6-3.8

我有一个类似的问题,但是我不喜欢那些答案,也许是因为其中大多数答案来自2013年。所以我详细阐述了自己的解决方案。

regex = r'\(.+?\)|".+?"|\w+' 
test = 'Hello Test (Test1 test2) (Hello1 hello2) other_stuff'
result = re.findall(regex, test)

这里您正在寻找三个不同的组:

  1. ()中包含的内容;括号应与反斜杠一起写
  2. “”中包含的内容
  3. 只言片语
  4. 使用?使您的搜索变得懒惰而不是贪婪