Python3中优雅的字符串解析

时间:2016-06-12 21:53:27

标签: python python-3.x parsing string-parsing

我有需要放入列表的字符串;比如我需要

C C .0033 .0016 'International Tables Vol C Tables 4.2.6.8 and 6.1.1.4' C

变为

['C', 'C', '.0033', '.0016', 'International Tables Vol C Tables 4.2.6.8 and 6.1.1.4', 'C']

因此引号中的所有内容都成为单个列表元素;否则,由空格分隔的所有内容都将成为单个列表元素。

我的第一个想法是一个简单的拆分,将不包含'的项目放入一个新数组中,然后将引用部分中的项目重新组合在一起:

>>> s.split()
['C', 'C', '.0033', '.0016', "'International", 'Tables', 'Vol', 'C', 'Tables', '4.2.6.8', 'and', "6.1.1.4'", 'C']
>>> arr = []
>>> i = 0
>>> while i < len(s):
        v = ''
        if s[i].startswith("'"):
            while not s[i].endswith("'"):
                v = v.append(s[i]+ " ")
                i += 1
            v.append(s[i])
            arr.append(v)
        else:
            arr.append(s[i])

但是这个策略非常难看,而且我必须假设字符串被分割在一个空格中。

s.partition("'")似乎很有希望:

>>> s.partition("'")
('C C .0033 .0016 ', "'", "International Tables Vol C Tables 4.2.6.8 and 6.1.1.4' C")

但它很尴尬,因为我必须在迭代时再次进行分区,并且它对于引用中的 中的哪一个是上下文敏感的。

是否有一种简单的Python3方法来拆分此字符串,如上所述?

1 个答案:

答案 0 :(得分:2)

您可以使用shlex模块。例如:

import shlex

print(shlex.split("C C .0033 .0016 'International Tables Vol C Tables 4.2.6.8 and 6.1.1.4' C"))