2012-12-16 4 views
1

문자열이 G:\\one\\two\\three.htm 인 경우 원하는 결과는 G/one/two/three.htm입니다. 어떻게 파이썬과 정규식으로 원하는 결과를 얻을 수 있습니까?
re.sub('\\\\\\\\', '/', string)을 시도했지만 작동했지만 왼쪽은 :입니다. 다시 정규 표현식을 사용하여 :을 제거하고 싶지 않습니다. 누가 위의 질문으로 저를 도울 수 있습니까? 내가합니다 (" 전에 r)는 "원시 문자열을"사용이중 백 슬래시 정규 표현식

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

참고 :

답변

6

이 파이썬에 적응 마티아스의 대답은, @입니다 :

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

주 정규식 패턴은 r':?\\+'이며 ':?\\+'이 아닙니다.

r은 파이썬에게 원시 문자열이라는 것을 알려줍니다.

파이썬은 하나의 백 슬래시를 문자열로 ':?\\+' 해석 : 위와 같이, list를 사용

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

, 당신은 문자열의 개별 문자를 볼 수 있습니다. '\\'은 하나의 백 슬래시로 구성된 파이썬 문자열입니다.

파이썬은 두 개의 백 슬래시와 문자열로 r':?\\+' 해석 :

In [8]: list(r':?\\+') 
Out[8]: [':', '?', '\\', '\\', '+'] 

파이썬은 네 개의 백 슬래시 문자열로 해석하기 때문에 ':?\\\\\\\\' 당신을 위해 일을하는 이유는 다음과 같습니다

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

그런 다음 정규식 엔진은 모든 두 개의 백 슬래시를 하나의 리터럴 백 슬래시와 일치하는 패턴으로 해석합니다. 따라서 정규 표현식은 네 개의 백 슬래시를 두 개의 리터럴 백 슬래시와 일치하는 패턴으로 해석합니다.

+0

과 같은 UNC 경로에서는 실패합니다. +1 통찰력을 주셔서 감사합니다! – Matthias

3

파이썬을 모른 채, 나는 당신은 아마 여기에 정규 표현식이 필요하지 않습니다

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

** + 1 ** ...'G : \\ foo : \\ bar '를'G/foo/bar'로 변환해도 괜찮습니다. – ghoti

+0

':? \\ +'는 나를 위해 일하지 않았지만':? \\\\\\\ '는 성공했습니다. – holys

3

을 제안 그래서 모든 백 슬래시를 벗어날 필요가 없으며, count 옵션을 replace으로 설정하면 파일 이름의 일부인 경우 첫 번째 콜론 뒤에 콜론을 남겨 둘 수 있습니다.

[내가하지만, G/one/two/three.htm 당신이 원하는 것을 정말 것을 조금 놀랐어요 인정해야한다.]

+0

\\\\ myServer \\ myDir \\ mySubDir \\ – nmz787

관련 문제