如何处理反斜杠转义字符?

4

我有一个字符串,格式如下:

s="part1,part2,part3,part4"

我可以通过调用s.split(",")命令将字符串分割成几部分。

现在的问题是,如果我的字符串中有一个反斜杠转义逗号怎么办?假设我有以下字符串:

s="part1,part2,pa\\,rt3,part4"

我希望能够得到["part1","part2","pa,rt3","part4"]作为结果。

我的初步想法是将\,替换为一个不存在的字符串,然后使用split命令拆分字符串,并将不存在的字符串替换为逗号。

你能否想到更好的解决方法?


1
这似乎是一个正则表达式的问题,尽管现在你可能有两个问题。 - wheaties
你是否也需要处理反斜杠转义的反斜杠? - dan04
@dan04:只需要逗号就可以了。因为逗号是一个部分的分隔符。但是,如果一个部分以反斜杠结尾,可能会导致问题,这在特定情况下是可以接受的。所以不需要处理反斜杠转义的反斜杠。 - Utku Zihnioglu
3个回答

11

将其替换为一个不存在的字符串是一个好的选择。

否则,你可以使用带有负回顾后断言的正则表达式,就像这样:

re.split(r'(?<!\\),', 'part1,part2,pa\\,rt3,part4')

2
所以这个正则表达式的意思是:往回看,如果没有\字符,则分割。这正是我要找的!谢谢。 - Utku Zihnioglu
1
@funktku:没错。在大多数正则表达式实现中,你有负面和正面的前后查找断言。显然,正面版本需要字符串可用,而负面版本接受除该字符串以外的所有内容。 - Wolph
负向回顾断言 (?<!...) 的好例子。感谢分享知识。 - Senthil Kumaran

4

csv 模块也可以处理这个问题:

import csv
from io import StringIO

s = 'part1,part2,pa\\,rt3,part4'
f = StringIO(s)

r = csv.reader(f,quoting=csv.QUOTE_NONE,escapechar='\\')
for row in r:
    print row

输出

['part1', 'part2', 'pa,rt3', 'part4']

-1

顺便提一下,'\'并不是逗号','的转义字符(not an escape character)。因此,你的字符串将会有一个带有'\'的合法单词。如果你特别想让'\'成为单词的一部分,那么基于正则表达式的解决方案对我来说看起来很好。


1
你误解了。你链接的页面甚至给出了以下语法:escapeseq ::= "" <任何ASCII字符>。确实,','不是Python字符串格式化中具有意义的转义序列,但这并不是OP问题的一部分。对于CSV,当逗号也是字段分隔符时,您需要使用反斜杠来转义逗号。 - Michael Kent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接