[英]Removing backslash from directories & files with Python
我的代碼類似於:
chars = ['~', '*', '\\', ':', '<', '>', '|', '?', '"']
def ReplaceChars(value):
for c in chars:
value = value.replace(c, '')
return value
def RenamePath(root, path):
newFilePath = ReplaceChars(path)
os.rename(os.path.join(root, path), os.path.join(root, newFilePath))
def WalkFileSystem(dirroot):
# Main Walk Through File System
for root, dirs, files in os.walk(dirroot, topdown=False):
for name in dirs:
searchObj = re.search(r'[%s]' % ''.join(chars), name)
if searchObj:
RenamePath(root, name)
for name in files:
searchObj = re.search(r'[%s]' % ''.join(chars), name)
if searchObj:
RenamePath(root, name)
問題是如果目錄或文件包含反斜杠,它將不會刪除它。 通過刪除r
我不再將其讀作原始字符串而是使用四個反斜杠,正則表達式模式需要兩個反斜杠。 正如我所期望的那樣,正則表達式模式出現在第一個arg中,並且搜索會將其選中。 它只是不會從路徑字符串中刪除反斜杠,我不知道為什么。 有任何想法嗎?
原始字符串在r'[%s]' % ''.join(chars)
插值中沒有做任何有用的事情,它首先被評估,不會轉義任何東西,然后chars
被連接和替換。 這就像做'[%s]' % ''.join(chars)
。
這個問題\\
s這里就是你需要'\\\\\\\\'
(或r'\\\\'
)為正則表達式和'\\\\'
進行更換。 正則表達式需要一個更多級別的轉義,因此您不能為兩者使用相同的字符串:
>>> path = 'a\\path'
>>> re.search('[\\\\]', path)
<_sre.SRE_Match object at 0x10d5c6920>
>>> path = 'a\\path'
>>> path.replace('\\\\', '')
'a\\path'
>>> path.replace('\\', '')
'apath'
您可以使用單獨的chars
數組進行搜索和替換:
chars_search = ['~', '*', '\\\\', ':', '<', '>', '|', '?', '"']
chars_replace = ['~', '*', '\\', ':', '<', '>', '|', '?', '"']
或者把它全部合二為一:
chars = ['~', '*', '\\\\', '\\', ':', '<', '>', '|', '?', '"']
什么最適合你。
答案: '[%s]' % ''.join(chars).encode('string_escape')
您可以使用此解決方案或famousgarkin提供的解決方案。 哪個適合您的需求
因此,經過大量的調查和測試,我發現了你的原始字符串命令
r'[%s]' % ''.join(chars)
不做你想要的。 您可以通過運行以下命令在Python控制台中測試:
命令: r'[%s]' % ''.join(chars)
vs r'[~*\\\\:<>|?"]'
輸出: '[~*\\\\:<>|?"]'
與'[~*\\\\\\\\:<>|?"]'
。
希望這對你有用。
解釋為什么原始字符串不起作用
以下是兩個命令的不同輸入/輸出:
輸入: r''.join(chars)
vs r'\\\\'.join(chars)
輸出: ~*\\\\:<>|?"
與~\\\\\\\\*\\\\\\\\\\\\\\\\\\\\:\\\\\\\\<\\\\\\\\>\\\\\\\\|\\\\\\\\?\\\\\\\\"
我試圖用這些輸出證明的是原始字符串表示法僅應用於直接連接到它的字符串,而不是之后的任何其他內容。 基本上,原始字符串將r''
解釋為''
,將r'\\\\'
為'\\\\\\\\'
。 然后它應用其他一切。 如果你看第二個輸出,你會看到在星號后面有四個反斜杠(應該是),但是總共有6個反斜杠。 這意味着在沒有原始字符串轉換的情況下讀入了chars
列表中的\\\\
,然后是連接的四個反斜杠。
再次,希望這會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.