16

使用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 并用“,”分割时,参数 forc得到正确处理。但是,它会删除引号。例如,我需要它们,因为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']
4

2 回答 2

26
>>> 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"']
  1. 正则表达式模式"[^"]*"匹配一​​个简单的带引号的字符串。
  2. "(?:\\.|[^"])*"匹配带引号的字符串并跳过转义的引号,因为\\.它消耗两个字符:反斜杠和任何字符。
  3. [^\s,"]匹配非分隔符。
  4. 在内部组合模式 2 和 3(?: | )+匹配一系列非分隔符和带引号的字符串,这是所需的结果。
于 2013-05-23T09:55:49.853 回答
0

正则表达式可以很容易地解决这个问题:

import re

mystring = 'a=foo, b=bar, c="foo, bar", d=false, e="false"'

splitString = re.split(',?\s(?=\w+=)',mystring)

此处的正则表达式模式查找后跟一个单词字符的空格,然后是一个等号,它可以根据需要拆分字符串并保留任何引号。

于 2013-05-23T09:57:46.003 回答