【问题标题】:shlex: Escaping quotes in Python 3shlex:在 Python 3 中转义引号
【发布时间】:2016-06-14 14:24:52
【问题描述】:

我想拆分 ascii 文本

1 'K\^o, Suk\'e'

打印为 Python 字符串

line = "1 'K\\^o, Suk\\'e'\n"

进入

['1', 'K\\^o, Suk\\'e']

shlex.split(line) 不起作用,给一个ValueError("No closing quotation")

我尝试添加到wordchars 如下:

>>> lexer = shlex.shlex(line)
>>> lexer.wordchars += "\\'"
>>> list(lexer)
['1', "'K\\", '^', 'o', ',', "Suk\\'e'"]

但这又不是我的意图。

没有报价,一切都按预期工作:

>>> line2= "1 'K\\^o, Suk\\e'\n"
>>> shlex.split(line2)
['1', 'K\\^o, Suk\\e']

如何解决这个问题?

编辑:我最接近的是:

>>> lexer = shlex.shlex(line)
>>> lexer.wordchars += "\\'"
>>> lexer.wordchars += " "
>>> lexer.wordchars += "\\^"
>>> lexer.wordchars += ","
>>> list(lexer)
['1', "'K\\^o,", "Suk\\'e'"]

还是不对。

编辑:示例字符串有些误导。它也应该能够分裂,比如说

>>> l1 = "C12 H2 'Hello friend'"

shlex 得到 l1 没问题。

【问题讨论】:

  • 为什么会在第一个空格上分割,而不是第二个空格?
  • @VasiliSyrakis:因为第二个在单引号内。
  • @Aquiles:我的 ascii 文件中的文本是 1 'K\^o, Suk\'e'。当使用f.readlines() 加载它时,它会打印为"1 'K\\^o, Suk\\'e'\n"。希望这能澄清我的意思。
  • 大声笑,真的...我的错...我在考虑单引号字符串...抱歉
  • 这个例子也是无效的python语法:l2 = "1 8.52 H22 '\''

标签: python python-3.x shlex


【解决方案1】:

您可以使用 posix 模式和 escapedquotes'" 而不仅仅是 "

>>> line = "1 'K\\^o, Suk\\'e'\n"
>>> lexer = shlex.shlex(line, posix=True)
>>> lexer.escapedquotes = "'\""
>>> list(lexer)
['1', "K\\^o, Suk'e"]

【讨论】:

    【解决方案2】:

    使用正则表达式进行拆分可能更简单。这将拆分为任何空格之前的第一个标记,然后是字符串的其余部分。

    re.match('(\S+)\s+(.*)', line).groups()
    

    【讨论】:

    • 不,我唯一的假设是它是 ascii。不过,我可能仍然可以使用您的方法。 . .
    • 查看我编辑的答案以获得更一般的令牌拆分。
    • 这是一个非常好的正则表达式,但在line = "C1 C2 C3" 上失败了,shlex.split 处理得很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    相关资源
    最近更新 更多