正则表达式如何处理双反斜杠?

4

这个字符串是 G:\\one\\two\\three.htm ,我想要的结果是 G/one/two/three.htm ,我应该如何使用 Python 和正则表达式得到期望的结果?
我尝试了 re.sub('\\\\\\\\', '/', string),它起作用了,但留下了一个 :。我不想再用正则表达式来去掉 :,谁能帮我解决上述问题?

3个回答

10

这是@Matthias的答案,适用于Python:

In [6]: re.sub(r':?\\+', '/', r'G:\\one\\two\\three.htm')
Out[6]: 'G/one/two/three.htm'

请注意,正则表达式模式是r':?\\+',而不是':?\\+'r告诉Python后面的内容是原始字符串。
Python将':?\\+'解释为一个带有一个反斜杠的字符串:
In [7]: list(':?\\+')
Out[7]: [':', '?', '\\', '+']

使用list,如上所述,可以让您看到字符串中的单个字符。'\\'是由一个反斜杠组成的Python字符串。
Python将r':?\\+'解释为带有两个反斜杠的字符串:
In [8]: list(r':?\\+')
Out[8]: [':', '?', '\\', '\\', '+']

为什么':?\\\\\\\\'对你有效呢?因为Python将其解释为一个带有四个反斜杠的字符串:

In [9]: list(':?\\\\\\\\')
Out[9]: [':', '?', '\\', '\\', '\\', '\\']

正则表达式引擎将每两个反斜杠解释为匹配一个字面上的反斜杠的模式。因此,正则表达式将四个反斜杠解释为一个模式,可以匹配两个字面上的反斜杠。

3

如果不了解Python,我建议:

re.sub(':?\\+', '/', string)

1
只要将 G:\\foo:\\bar 转换为 G/foo/bar 是可以的,这看起来对我来说很好。**+1** - ghoti

3

在这里,你可能不需要使用正则表达式:

>>> s = r"G:\\one\\two\\three.htm"
>>> print s
G:\\one\\two\\three.htm
>>> s.replace(r"\\","/")
'G:/one/two/three.htm'
>>> s.replace(r"\\","/").replace(":","",1)
'G/one/two/three.htm'

请注意,我使用了“原始字符串”(在引号前加上r)以便不必转义所有反斜杠,并且使用replace中的count选项,以留下除第一个冒号外的任何冒号,以防它们是文件名的一部分。
[我必须承认,我有点惊讶于G/one/two/three.htm确实是您想要的。]

这对于 UNC 路径失败,例如 \\myServer\myDir\mySubDir\。 - nmz787

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