除非在前面,否则Python会将字符串与空格分开

时间:2014-04-18 17:40:28

标签: python python-2.7 split escaping

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

我正在尝试使用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']

如果有人可以帮助我那会很棒!

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

修改: 现在这已经解决了,我忘了问一下如何检测反斜杠是否已被转义?

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分: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']