在python中解析字符串

时间:2017-08-21 00:16:54

标签: python regex python-2.7

我想转此:

mystr = '  foo1   (foo2 foo3 (foo4))' 

成:

['foo1','foo2 foo3 (foo4)']

所以基本上我必须根据一些空格/制表符和括号进行拆分。

我已经看到repack split函数可以处理几个分隔符(Python: Split string with multiple delimiters),但我无法理解正确的方法来解析这种字符串。

哪种方法是最好的pythonic和简单方法?

3 个答案:

答案 0 :(得分:4)

据我所知,这与你想要的一致,而且非常简单。它只是使用一些切片来隔离第一个单词和括号之间的部分。由于额外的空间,它还必须使用strip几次。它可能看起来有点冗长,但说实话,如果任务可以通过这种简单的字符串操作完成,我觉得复杂的解析是不必要的(虽然我可能弄错了)。请注意,此 在要拆分的空白量方面具有灵活性。

mystr = '  foo1   (foo2 foo3 (foo4))' 
mystr = mystr.strip()
i = mystr.index(' ')
a = mystr[:i].strip()
b = mystr[i:].strip()[1:-1]
print([a, b])

带输出

['foo1', 'foo2 foo3 (foo4)']

虽然我还不完全清楚这是否是你想要的。让我知道它是否有效或需要改变什么。

答案 1 :(得分:1)

如果你的字符串结构与你说的那样严格定义,你可以使用正则表达式来轻松地解析它:

import re

mystr = '  foo1   (foo2 foo3 (foo4))'

pattern = r'(\S+)\s+\((.*)\)'
match = re.search(pattern, mystr)
results = match.groups() # ('foo1', 'foo2 foo3 (foo4)')

如果您的真实输入没有像您提出的问题那样明确定义,请注意这种方法。正则表达式只能解析regular languages,括号通常的工作方式不是“常规”。在这个问题中,你只关心处理一个单集括号(最外面的),所以一个简单的贪婪匹配工作。将此解决方案调整为其他输入格式可能很难或不可能,即使它们看起来非常相似!

答案 2 :(得分:0)

[mystr.split('   ')[0].strip(),mystr.split('   ')[1][1:-1]]

简单的单行程。输出:

['foo1', 'foo2 foo3 (foo4)']