Python正则表达式,拆分参数,忽略引号中的逗号

时间:2018-07-19 14:20:56

标签: python regex

让我们说一行包含用,分隔的参数的行

'0xe1b04048, FUTEX_WAIT, 0, NULL , "Hey, World, how, are, you"'

我想要python中的正则表达式,它将此序列拆分为包含项的列表(为清楚起见,逐行拆分一项)

[
'0xe1b04048', 
'FUTEX_WAIT', 
'0', 
'NULL',
'"Hey, World, how, are, you"'
]

我试图使正则表达式具有负面的前瞻性,至少可以处理评论中的一个逗号,我的计划是扩展它,但是我什至没有做到。 呼唤 re.split(r",\s(?!\".*,\s.*\")",args)

'0xe1b04048, FUTEX_WAIT, 0, NULL , "Hey, World"'

结果

[
'0xe1b04048', 
'FUTEX_WAIT', 
'0', 
'NULL , "Hey', 
'World"'
]

3 个答案:

答案 0 :(得分:3)

您可以将csv模块与skipinitialspace=True一起使用

例如:

import csv

with open(filename, "r") as infile:
    reader = csv.reader(infile, delimiter=",", skipinitialspace=True)
    for line in reader:
        print([i.strip("'") for i in line])

输出:

['0xe1b04048', 'FUTEX_WAIT', '0', 'NULL ', 'Hey, World, how, are, you']

答案 1 :(得分:2)

为此,您可能应该使用csv。但是,如果您更喜欢纯Python解决方案(不过也没有正则表达式...),则可以尝试以下操作:首先用"分割,然后将所有 even 部分分割为{{1 }}。无论列表是否以字符串元素开头,字符串的内容始终位于奇数位置。

,

当然,这是假定没有嵌套或转义的引号。

答案 2 :(得分:0)

(将此作为第二个答案发布,因为该方法与第一个方法大不相同)。

如果您真的想为此使用正则表达式,则可以尝试以下操作:".+?"|[^", ]+这将查找包含在"中或不包含"也不包含在内的所有部分,或空格。

>>> s = '"start", 0xe1b04048, FUTEX_WAIT, 0, NULL , "Hey, World, how, are,  you", not, a, string, "another, string"'
>>> p = r'".+?"|[^", ]+'
>>> re.findall(p, s)
['"start"',
 '0xe1b04048',
 'FUTEX_WAIT',
 '0',
 'NULL',
 '"Hey, World, how, are, you"',
 'not',
 'a',
 'string',
 '"another, string"']

同样,如果存在嵌套或转义的引号,这可能会失效,并且考虑使用csv的所有事物可能是更好的主意。