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

Posted

技术标签:

【中文标题】Python:拆分字符串,尊重并保留引号[重复]【英文标题】:Python: Split a string, respect and preserve quotes [duplicate] 【发布时间】:2013-05-18 14:03:15 【问题描述】:

使用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']

【问题讨论】:

引号内可以有(转义)引号吗? 是的,它们可以(用反斜杠转义)。 我相信这是 ***.com/a/79985/1540600 的副本,它提供了一个更好的答案。 (使用shlex.split()。) 这不是重复的,因为shlex.split 不能指定分隔符。 我同意 RNA。如需使用自定义分隔符,请参阅 ***.com/questions/56791723/… 【参考方案1】:
>>> 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 匹配一系列非分隔符和带引号的字符串,这是所需的结果。

【讨论】:

谢谢你,就像一个魅力! 解释它是如何工作的,我会投票的 @JasonS 我同意,但regex101.com 有一个有用的解释部分可能会有所帮助,例如:i.imgur.com/SJMAQPI.png 这很有用,但这不是重点,重点是一个好的答案可以解释它为什么起作用。 @JasonS 添加了一些解释。【参考方案2】:

Regex 可以很容易地解决这个问题:

import re

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

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

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

【讨论】:

这将拆分'c="foo, bar="' 公平点。我想这就是正则表达式的问题,写一些不那么明确的东西似乎总是会让你遇到意想不到的情况,但明确的正则表达式看起来很难阅读和理解甚至发生了什么。

以上是关于Python:拆分字符串,尊重并保留引号[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在逗号上拆分字符串并忽略双引号中的逗号[重复]

拆分分隔字符串并删除转义序列[重复]

python脚本入参的单、双引号

在 Python 中,如何拆分字符串并保留分隔符?

JavaScript拆分带有多个引号和不同ID的字符串[重复]

Mysql中反引号和单引号的区别