Python:拆分字符串,尊重并保留引号

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模式和以", "分隔时,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']

2
在引号内部是否可以有(转义的)引号? - Janne Karila
是的,它们可以(用反斜杠转义)。 - sudoremo
我认为这是一个重复的问题,https://dev59.com/fnVD5IYBdhLWcg3wHn2d#79985提供了更好的答案。(使用`shlex.split()`。) - sferencik
5
这不是重复的内容,因为shlex.split无法指定分隔符。 - RNA
我同意RNA的观点。如需使用自定义分隔符,请参见https://stackoverflow.com/questions/56791723/split-a-string-with-custom-delimiter-respect-and-preserve-quotes-single-or-dou/。 - luca
1个回答

27
>>> 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组合在(?: | )+内,可以匹配非分隔符和带引号的字符串序列,这是期望的结果。

4
请让我为您解释其工作原理,我会尽力使翻译通俗易懂但不改变原意。如果满意,请点赞。 - Jason S
1
@JasonS 我同意,不过 regex101.com 有一个有用的解释部分,可能会对你有所帮助,例如:https://i.imgur.com/SJMAQPI.png - blah238
1
那很有用,但这不是重点,重点是一个好的答案要解释为什么它能工作。 - Jason S
2
@JasonS 添加了一些解释。 - Janne Karila
@JanneKarila 但是这也忽略了空字符串。我该如何保留它们? - Muhammad Zeeshan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接