在Python中按空格分割字符串,前面有\的除外

8 投票
2 回答
1886 浏览
提问于 2025-04-18 03:18

抱歉,如果这篇帖子读起来有点让人困惑,这是我在这个网站上的第一篇帖子,而且这个问题很难提出来,我已经尽力了。我也试着在网上搜索,但找不到任何相关的信息。

我想用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 个回答

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']
13

看起来你正在写一个命令行解析器。如果是这样的话,我推荐你使用 shlex.split。这个工具可以根据命令行的规则正确地分割命令字符串,还能妥善处理转义字符。举个例子:

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

撰写回答