如何可以解析字符串分隔成一个列表(警告)逗号?(How can i parse a comma de

2019-06-26 18:48发布

我需要能够获得一个字符串,如:

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

成:

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

我有一个感觉,(与#python提示),该解决方案将涉及的shlex模块。

Answer 1:

该shlex模块解决方案允许转义引号,一个报价逃脱另一个,和所有喜欢的东西外壳支持。

>>> 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']


Answer 2:

这取决于你想多么复杂获得......你想允许多于一个类型的引用的。 如何逃脱的报价?

你的语法看起来很像常见的CSV文件格式,它是由Python标准库的支持:

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!



Answer 3:

您可能还需要考虑的CSV模块。 我还没有尝试过,但它看起来像你的输入数据,而不是shell语法(这是什么shlex解析)接近CSV。



Answer 4:

你可以这样做:

>>> 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']


Answer 5:

我想说一个正则表达式将是你在找什么在这里,虽然我并不十分熟悉Python的正则表达式引擎。

假设你使用懒惰的比赛,你可以得到一组比赛上,你可以把你的阵列的字符串。



Answer 6:

如果不需要漂亮,这可能让你对你的方式:

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('"'))], [])


文章来源: How can i parse a comma delimited string into a list (caveat)?