我刚才问了一个问题(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结合为一个而不是两个。
它也不允许同时使用括号和引号分割。
答案 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)
这里您正在寻找三个不同的组: