使用python,我想拆分以下字符串:
a=foo, b=bar, c="foo, bar", d=false, e="false"
这应该产生以下列表:
['a=foo', 'b=bar', 'c="foo, bar"', 'd=false', 'e="false'"']
在posix-mode中使用shlex并使用“,”分割时,c
的参数会被正确处理。但是,它删除了引号。我需要它们,因为false
与"false"
不同,例如。
到目前为止我的代码:
import shlex
mystring = 'a=foo, b=bar, c="foo, bar", d=false, e="false"'
splitter = shlex.shlex(mystring, posix=True)
splitter.whitespace += ','
splitter.whitespace_split = True
print list(splitter) # ['a=foo', 'b=bar', 'c=foo, bar', 'd=false', 'e=false']
答案 0 :(得分:22)
>>> s = r'a=foo, b=bar, c="foo, bar", d=false, e="false", f="foo\", bar"'
>>> re.findall(r'(?:[^\s,"]|"(?:\\.|[^"])*")+', s)
['a=foo', 'b=bar', 'c="foo, bar"', 'd=false', 'e="false"', 'f="foo\\", bar"']
"[^"]*"
匹配简单的引用字符串。"(?:\\.|[^"])*"
匹配带引号的字符串并跳过转义引号,因为\\.
会占用两个字符:反斜杠和任何字符。[^\s,"]
匹配非分隔符。(?: | )+
内组合模式2和3会匹配一系列非分隔符和带引号的字符串,这是所需的结果。答案 1 :(得分:0)
正则表达式可以轻松解决这个问题:
import re
mystring = 'a=foo, b=bar, c="foo, bar", d=false, e="false"'
splitString = re.split(',?\s(?=\w+=)',mystring)
这里的正则表达式模式查找一个空格,后跟一个单词字符,然后是一个等号,根据需要分割你的字符串并保留任何引号。