3

这个字符串是G:\\one\\two\\three.htm,我想要的结果是G/one/two/three.htm,我怎样才能用 python 和正则表达式得到想要的结果?
我试过re.sub('\\\\\\\\', '/', string)了,它工作但离开了:。我不想再次使用正则表达式来删除:. 谁能帮我解决上述问题?

4

3 回答 3

9

这是@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]: [':', '?', '\\', '\\', '\\', '\\']

然后,正则表达式引擎将每两个反斜杠解释为与一个文字反斜杠匹配的模式。所以正则表达式将四个反斜杠解释为匹配两个文字反斜杠的模式。

于 2012-12-16T15:42:56.653 回答
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在 之前"),这样我就不必转义所有的反斜杠,并且count可以选择replace在第一个冒号之后留下任何冒号,以防它们是文件名的一部分。

[我不得不承认我有点惊讶这G/one/two/three.htm真的是你想要的,不过。]

于 2012-12-16T14:24:28.393 回答
3

在不了解python的情况下,我建议

re.sub(':?\\+', '/', string)
于 2012-12-16T14:19:25.020 回答