让我们说一行包含用,
分隔的参数的行
'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"'
]
答案 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
的所有事物可能是更好的主意。