この文字列はG:\\one\\two\\three.htm
、G/one/two/three.htm
私が望む結果は、Pythonと正規表現で目的の結果を得るにはどうすればよいですか?
私は試しre.sub('\\\\\\\\', '/', string)
ました、それはうまくいきましたが、去り:
ました。を削除するために正規表現を再度使用したくありません:
。上記の質問で誰が私を助けることができますか?
3 に答える
これは@Matthiasの答えであり、Pythonに適合しています。
In [6]: re.sub(r':?\\+', '/', r'G:\\one\\two\\three.htm')
Out[6]: 'G/one/two/three.htm'
正規表現パターンはr':?\\+'
、ではなく、であることに注意してください':?\\+'
。
はr
Pythonに、次は生の文字列であることを伝えます。
':?\\+'
Pythonは、バックスラッシュが1つある文字列として解釈します。
In [7]: list(':?\\+')
Out[7]: [':', '?', '\\', '+']
上記list
のようにを使用すると、文字列内の個々の文字を確認できます。'\\'
1つの円記号で構成されるPython文字列です。
Pythonはr':?\\+'
、2つの円記号を含む文字列として解釈します。
In [8]: list(r':?\\+')
Out[8]: [':', '?', '\\', '\\', '+']
':?\\\\\\\\'
Pythonがそれを4つのバックスラッシュを持つ文字列として解釈するため、あなたのために働いた理由は次のとおりです。
In [9]: list(':?\\\\\\\\')
Out[9]: [':', '?', '\\', '\\', '\\', '\\']
次に、正規表現エンジンは、2つのバックスラッシュごとに、1つのリテラルバックスラッシュに一致するパターンとして解釈します。したがって、正規表現は4つの円記号を2つの文字の円記号に一致するパターンとして解釈します。
Pythonを知らなくても、私は提案します
re.sub(':?\\+', '/', string)
ここではおそらく正規表現は必要ありません。
>>> 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
[しかし、それが本当にあなたが望んでいるものであることに少し驚いていることを認めなければなりません。]