Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:拆分字符串,尊重并保留引号_Python_Split_Shlex - Fatal编程技术网

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

Python:拆分字符串,尊重并保留引号,python,split,shlex,Python,Split,Shlex,使用python,我希望拆分以下字符串: a=foo, b=bar, c="foo, bar", d=false, e="false" 这将导致以下列表: ['a=foo', 'b=bar', 'c="foo, bar"', 'd=false', 'e="false'"'] 在posix模式下使用shlex并用“,”拆分时,c的参数得到正确处理。但是,它会删除引号。我需要它们,因为false与不同,例如,“false” 到目前为止,我的代码是: import shlex mystring

使用python,我希望拆分以下字符串:

a=foo, b=bar, c="foo, bar", d=false, e="false"
这将导致以下列表:

['a=foo', 'b=bar', 'c="foo, bar"', 'd=false', 'e="false'"']
在posix模式下使用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']
  • 正则表达式模式
    “[^”]*”
    匹配一个简单的带引号的字符串
  • “(?:\\.[^”])*”
    匹配带引号的字符串并跳过转义引号,因为
    \.
    使用两个字符:反斜杠和任意字符
  • [^\s,”]
    匹配非分隔符
  • (?:|)+
    中的模式2和3组合在一起将匹配一系列非分隔符和带引号的字符串,这是所需的结果

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

    import re
    
    mystring = 'a=foo, b=bar, c="foo, bar", d=false, e="false"'
    
    splitString = re.split(',?\s(?=\w+=)',mystring)
    

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

    引号中是否可以有(转义)引号?是的,可以(用反斜杠转义)。我相信这是的副本,它提供了一个更好的答案。(使用
    shlex.split()
    )这不是重复的,因为
    shlex.split
    无法指定定界符。我同意RNA。要使用自定义定界符,请参见“谢谢”,它就像一个符咒!解释它是如何工作的,我将upvote@JasonS我同意,但有一个有用的解释部分可能会有所帮助,例如:这是有用的,但这不是重点,重点是一个好的答案解释ns为什么它会起作用。@JasonS补充了一些解释。这会分裂出公平点。我想这就是正则表达式的问题所在,写一些不太明确的东西似乎总是会让你遇到意想不到的情况,而明确的正则表达式读起来甚至很难理解到底发生了什么。
    import re
    
    mystring = 'a=foo, b=bar, c="foo, bar", d=false, e="false"'
    
    splitString = re.split(',?\s(?=\w+=)',mystring)