多个Re.Subs Python

Rob*_*ood 1 python

抱歉,但是我无法从Python文档或从Google找到的任何内容中弄清楚这一点。

因此,我一直在从StackOverflow的一位出色助手中重命名代码为99%的文件。

我正在整理一个重命名脚本(这是我从这里的人那里得到的帮助),该脚本可以使用名称(而不是扩展名)。

我确定我会提出更多的替代方案,但是目前的问题是我不知道该怎么做一个以上的替代方案。 当前代码(用空格替换点):

import os, shutil, re

def rename_file (original_filename):
    name, extension = os.path.splitext(original_filename)
    #Remove Spare Dots
    modified_name = re.sub("\.", r" ", name)
    new_filename = modified_name + extension
    try:
        # moves files or directories (recursively)
        shutil.move(original_filename, new_filename)
    except shutil.Error:
        print ("Couldn't rename file %(original_filename)s!" % locals())
[rename_file(f) for f in os.listdir('.') if not f.startswith('.')]
Run Code Online (Sandbox Code Playgroud)

希望也

re.sub("C126", "Perception", name)
re.sub("Geo1", "Geography", name)
Run Code Online (Sandbox Code Playgroud)

另外,如果我能将除“ and | if”以外的任何单词的首字母大写,那将是很棒的

我试过了

modified_name = re.sub("\.", r" ", name) && re.sub(... 
Run Code Online (Sandbox Code Playgroud)

但是那没有用;也没有把它们放在不同的线上。我要如何做/制作所有的潜水艇和东西?

Edu*_*nec 5

只需一遍又一遍地对相同的字符串进行操作,每次都将其替换:

name = re.sub(r"\.", r" ", name)
name = re.sub(r"C126", "Perception", name)
name = re.sub(r"Geo1", "Geography", name)
Run Code Online (Sandbox Code Playgroud)

@DanielRoseman是正确的,这些是文字形式,不需要正则表达式即可描述/找到/替换。您可以timeit用来说明普通的旧版本replace()是可取的:

In [16]: timeit.timeit("test.replace('asdf','0000')",setup="test='asdfASDF1234'*10")
Out[16]: 1.0641241073608398

In [17]: timeit.timeit("re.sub(r'asdf','0000',test)",setup="import re; test='asdfASDF1234'*10")
Out[17]: 6.126996994018555
Run Code Online (Sandbox Code Playgroud)


Mar*_*ver 5

好吧,每次调用 re.sub() 时,它都会返回一个新的、更改过的字符串。因此,如果您想继续修改每个新字符串,请继续将新字符串分配给相同的变量名称。本质上,不要认为自己一遍又一遍地修改同一个字符串 - 相反,认为自己每次都修改一个新的字符串。

示例:如果您使用字符串“lol.Geo1”,

newString = re.sub("\.", r" ", originalString)
Run Code Online (Sandbox Code Playgroud)

将返回字符串“lol Geo1”,并将其分配给 newString。现在,如果您想更改该新字符串,请进行下一次替换,它将返回另一个字符串,您可以再次将其放入“newString”中 -

newString = re.sub("Geo1", "Geography", newString)
Run Code Online (Sandbox Code Playgroud)

现在,newString 的计算结果为“lol Geography”。每次替换都会创建一个新字符串,而不是同一个字符串。这就是为什么

modified_name = re.sub("\.", r" ", name) && re.sub(... 
Run Code Online (Sandbox Code Playgroud)

不起作用 - “re.sub(".", r" ", name)” 将返回一个字符串,“re.sub(...)” 将返回另一个字符串,等等 - 其中每一个字符串仅在原始字符串上进行单独替换,如下所示:

modified_name = "lol Geo1" && "lol.Geography"...
Run Code Online (Sandbox Code Playgroud)

因此,要使其正常工作,请遵循其他发帖人的建议 - 只需对所需的每个替换重复分配,将替换的 newString 分配给自身,直到完成所有替换。

希望这是一个明确的解释。随意问的问题。:)