【问题标题】:Python split string with space unless a \ is in frontPython 用空格分割字符串,除非前面有 \
【发布时间】:2014-04-18 17:40:27
【问题描述】:

抱歉,如果这篇文章读起来有点混乱,这是我在这个网站上的第一篇文章,这是一个很难问的问题,我已经尽力了。我也试过谷歌搜索,但我找不到任何东西。

我正在尝试在 python 中创建自己的命令行,例如应用程序,我想知道如果“\”不在空格前面,如何拆分字符串并删除反斜杠。

这就是我的意思。

>>> c = "play song I\ Want\ To\ Break\ Free"
>>> print c.split(" ")
['play', 'song', 'I\\', 'Want\\', 'To\\', 'Break\\', 'Free']

当我将c 与空格分开时,它会保留反斜杠,但会删除空格。 这就是我想要的样子:

>>> c = "play song I\ Want\ To\ Break\ Free"
>>> print c.split(" ")
['play', 'song', 'I ', 'Want ', 'To ', 'Break ', 'Free']

如果有人可以帮助我,那就太好了!

另外,如果它需要正则表达式,请您解释一下,因为我以前从未使用过它们。

编辑: 现在这个问题已经解决了,我忘了问有没有办法检测反斜杠是否被转义?

【问题讨论】:

  • 一开始我看错了;您确实想要在空格上进行拆分,但是当空格前面带有反斜杠时,您希望将空格保留为拆分字符串的一部分。 检查.

标签: python python-2.7 split escaping


【解决方案1】:

看起来您正在编写命令行解析器。如果是这样,我可以推荐shlex.split吗?它根据 shell 词法规则正确拆分命令字符串,并正确处理转义。示例:

>>> import shlex
>>> shlex.split('play song I\ Want\ To\ Break\ Free')
['play', 'song', 'I Want To Break Free']

【讨论】:

  • 宾果游戏!正是我想要的!如果它在引号中,它甚至知道不分裂!谢谢。 :) 这很有用,因为它将是 raw_input() 的输入,所以如果它有引号,则不要拆分!谢谢。
  • @aPyDeveloper:我认为您想要生成演示输出! :-)
  • 得到了我想要的输出
【解决方案2】:

只需在空格上拆分,然后将任何以反斜杠结尾的字符串替换为以空格结尾的字符串:

[s[:-1] + ' ' if s.endswith('\\') else s for s in c.split(' ')]

这是一个列表推导; c 以空格分隔,并检查每个结果字符串末尾是否有尾随 \ 反斜杠;如果是这样,则删除最后一个字符并添加一个空格。

一个小缺点:如果原始字符串以反斜杠(没有空格)结尾,则最后一个反斜杠也会被空格替换。

演示:

>>> c = r"play song I\ Want\ To\ Break\ Free"
>>> [s[:-1] + ' ' if s.endswith('\\') else s for s in c.split(' ')]
['play', 'song', 'I ', 'Want ', 'To ', 'Break ', 'Free']

要处理转义的反斜杠,您需要计算反斜杠的数量。偶数表示反斜杠被转义:

[s[:-1] + ' ' if s.endswith('\\') and (len(s) - len(s.rstrip('\\'))) % 2 == 1 else s
 for s in c.split(' ')]

演示:

>>> c = r"play song I\ Want\ To\ Break\\ Free"
>>> [s[:-1] + ' ' if s.endswith('\\') and (len(s) - len(s.rstrip('\\'))) % 2 == 1 else s
...  for s in c.split(' ')]
['play', 'song', 'I ', 'Want ', 'To ', 'Break\\\\', 'Free']

【讨论】:

  • 如果字符串以反斜杠结尾会怎样?
  • @WilliamKunkel:最后一个反斜杠也被替换了。赫姆兹。
  • 如果你也想帮助我,我也刚刚更新了我的任务! ;)
  • @aPyDeveloper:您必须计算字符串末尾的反斜杠数量;如果是这样的话,反斜杠就被转义了。 len(s) - len(s.rstrip('\\')) 会告诉你字符串末尾有多少个反斜杠。
猜你喜欢
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 2012-11-17
  • 2012-09-22
  • 1970-01-01
  • 2014-10-04
相关资源
最近更新 更多