Python中的多个Re.Subs

Python中的多个Re.Subs,python,Python,抱歉,但我无法从Python文档或从Google找到的任何东西中理解这一点 所以,我一直在努力重命名代码为99%的文件,这些文件来自StackOverflow的一个很棒的助手 我正在编写一个重命名脚本(这是我从这里的某个人那里得到的帮助),该脚本与名称(而不是扩展名)一起工作 我相信我会想出更多的替代品,但我目前的问题是,我不知道如何做一个以上的re.sub。 当前代码(用空格替换点): import os, shutil, re def rename_file (original_filen

抱歉,但我无法从Python文档或从Google找到的任何东西中理解这一点

所以,我一直在努力重命名代码为99%的文件,这些文件来自StackOverflow的一个很棒的助手

我正在编写一个重命名脚本(这是我从这里的某个人那里得到的帮助),该脚本与名称(而不是扩展名)一起工作

我相信我会想出更多的替代品,但我目前的问题是,我不知道如何做一个以上的re.sub。 当前代码(用空格替换点):

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('.')]
希望也

re.sub("C126", "Perception", name)
re.sub("Geo1", "Geography", name)
此外,如果我能让它大写除“and | if”之外的任何单词的第一个字母,那就太棒了

我试过了

modified_name = re.sub("\.", r" ", name) && re.sub(... 
但这不起作用;也没有把他们放在不同的线路上。我如何做所有我想做/制作的潜艇和东西

modified_name = re.sub("\.", r" ", name)
modified_name = re.sub("C126", "Perception", modified_name)
modified_name = re.sub("Geo1", "Geography", modified_name)

将一个字符串的输出作为下一个字符串的输入进行传递。

只需反复操作同一字符串,每次都替换它:

name = re.sub(r"\.", r" ", name)
name = re.sub(r"C126", "Perception", name)
name = re.sub(r"Geo1", "Geography", name)
@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

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

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

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

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

modified_name = re.sub("\.", r" ", name) && re.sub(... 
不起作用-“re.sub(“.”,r“”,name)”将返回一个字符串,“re.sub(…)”将返回另一个字符串,等等-这些字符串中的每一个仅在原始字符串上有各自的替换,如下所示:

modified_name = "lol Geo1" && "lol.Geography"...
因此,为了让它发挥作用,请按照另一位发帖人的建议进行操作——只需不断地用您想要的每个替换项重复该任务,将替换后的新闻字符串分配给自己,直到您完成所有替换项


希望这是一个清楚的解释。请随意提问。:)

我建议,如果要多次使用同一个regexp,只需编译一次,然后随意重复使用即可。这将使您的脚本更快。看一看,下面有一些正确的答案,但我要指出,绝对没有理由使用正则表达式来进行这些替换。普通
name=name.replace('.','')
etc将完成此任务。安全提示:始终使用原始字符串和包含反斜杠的regexp。实际上,您不需要将它与“\”一起使用,但它是标准的防御性编程;你的下一个RE将需要它。只要注意到这是一个@RobinHood,当你尝试它时会发生什么?我做错了什么`导入操作系统,shutil,重新定义重命名文件(原始文件名):名称,扩展名=os.path.splitext(原始文件名)#删除备用点修改的\u名称=re.sub(\,r“”,name)修改的\u名称=re.sub(\-),r“”,修改的\u名称)新的\u文件名=修改的\u名称+扩展名尝试:\移动文件或目录(递归)shutil.move(原始文件名,新文件名)除了shutil之外。错误:print(“无法重命名文件%(原始文件名)s!”%locals())[在os.listdir('.')中为f重命名文件(f)如果不是f.startswith('.')]`@RobinHood你能把它放在你的个人帖子中,还是放在一个文件夹中?在没有缩进的情况下很难检出python:PYea,对不起,我不知道如何将它放在这里的正确格式中。Pastebin:@RobinHood-我把它缩进了,它对我有效-我把脚本放在它自己的目录中,创建了一个文件“lol.g-eo”,从空闲状态运行脚本,然后它写回“lol.g-eo”。如何运行该脚本?我先将cd复制到目录,然后使用“python/root/rename.py”我给出的示例有效,但如果在其他行中添加,则会失败。它是否作为整个脚本的一部分进行过尝试?@Eduardo,您应该为r“\”使用原始字符串。这在这里并不重要,但在示例中使用它很重要。(愚蠢到不让我编辑一个字母…)
modified_name = re.sub("\.", r" ", name) && re.sub(... 
modified_name = "lol Geo1" && "lol.Geography"...