如何将逗号分隔的字符串解析为列表(警告)?

时间:2008-09-22 22:54:10

标签: python split escaping quotes

我需要能够采用如下字符串:

'''foo, bar, "one, two", three four'''

成:

['foo', 'bar', 'one, two', 'three four']

我有一种感觉(来自#python的提示)解决方案将涉及shlex模块。

6 个答案:

答案 0 :(得分:40)

这取决于你想要获得多么复杂......你想要允许多种类型的引用吗?逃脱报价怎么样?

您的语法非常类似于Python标准库支持的常见CSV文件格式:

import csv
reader = csv.reader(['''foo, bar, "one, two", three four'''], skipinitialspace=True)
for r in reader:
  print r

输出:

['foo', 'bar', 'one, two', 'three four']

HTH!

答案 1 :(得分:26)

shlex模块解决方案允许转义引号,一个引用转义另一个,以及所有花哨的shell支持。

>>> import shlex
>>> my_splitter = shlex.shlex('''foo, bar, "one, two", three four''', posix=True)
>>> my_splitter.whitespace += ','
>>> my_splitter.whitespace_split = True
>>> print list(my_splitter)
['foo', 'bar', 'one, two', 'three', 'four']

转义引号示例:

>>> my_splitter = shlex.shlex('''"test, a",'foo,bar",baz',bar \xc3\xa4 baz''',
                              posix=True) 
>>> my_splitter.whitespace = ',' ; my_splitter.whitespace_split = True 
>>> print list(my_splitter)
['test, a', 'foo,bar",baz', 'bar \xc3\xa4 baz']

答案 2 :(得分:5)

您可能还想考虑csv模块。我没有尝试过,但看起来您的输入数据更接近于CSV而不是shell语法(这是shlex解析的)。

答案 3 :(得分:1)

你可以这样做:

>>> import re
>>> pattern = re.compile(r'\s*("[^"]*"|.*?)\s*,')
>>> def split(line):
...  return [x[1:-1] if x[:1] == x[-1:] == '"' else x
...          for x in pattern.findall(line.rstrip(',') + ',')]
... 
>>> split("foo, bar, baz")
['foo', 'bar', 'baz']
>>> split('foo, bar, baz, "blub blah"')
['foo', 'bar', 'baz', 'blub blah']

答案 4 :(得分:0)

我会说正则表达式会是你在这里寻找的,虽然我对Python的Regex引擎并不十分熟悉。

假设您使用延迟匹配,您可以在字符串上获得一组匹配,您可以将其放入数组中。

答案 5 :(得分:-2)

如果它不需要漂亮,这可能会让你顺利:

def f(s, splitifeven):
    if splitifeven & 1:
        return [s]
    return [x.strip() for x in s.split(",") if x.strip() != '']

ss = 'foo, bar, "one, two", three four'

print sum([f(s, sie) for sie, s in enumerate(ss.split('"'))], [])