【问题标题】:Multiple Re.Subs Python多个 Re.Subs Python
【发布时间】:2012-03-27 22:17:40
【问题描述】:

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

所以,我一直在用 StackOverflow 的一位出色助手的代码 99% 重命名文件。

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

我确信我会想出更多替代品,但我目前的问题是我无法弄清楚如何做多个 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(... 

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

【问题讨论】:

  • 我建议,如果你要多次使用同一个正则表达式,编译一次,然后再重复使用。这将使您的脚本更快。看看re.compile()
  • 您在下面得到了一些正确答案,但我要指出,绝对没有理由使用正则表达式来进行这些替换。普通的name = name.replace('.', ' ') 等就可以完成这项工作。
  • 安全提示:始终使用带有反斜杠的正则表达式的原始字符串。你实际上并不需要它与“\。”,但它是标准的防御性编程;您的下一个 RE 将需要它。

标签: python


【解决方案1】:
modified_name = re.sub("\.", r" ", name)
modified_name = re.sub("C126", "Perception", modified_name)
modified_name = re.sub("Geo1", "Geography", modified_name)

将一个的输出作为下一个的输入。

【讨论】:

  • @RobinHood,你试试会发生什么?
【解决方案2】:

只是一遍又一遍地操作同一个字符串,每次都替换它:

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

【讨论】:

  • @Eduardo,您应该为 r"\." 使用原始字符串。在这里没关系,但在示例中使用很重要。 (愚蠢的 SO 不会让我做一个字母的编辑......)
【解决方案3】:

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

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

newString = re.sub("\.", r" ", originalString)

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

newString = re.sub("Geo1", "Geography", newString)

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

modified_name = re.sub("\.", r" ", name) && re.sub(... 

没用 - “re.sub(".", r" ", name)" 将返回一个字符串,“re.sub(...)” 将返回另一个字符串,等等,等等 -这些字符串中的每一个都只在原始字符串上进行了单独的替换,如下所示:

modified_name = "lol Geo1" && "lol.Geography"...

所以,要让它发挥作用,请遵循其他发帖人的建议 - 只需不断重复分配您想要的每个替换,将替换的 newString 分配给它自己,直到您完成所有替换。

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

【讨论】:

  • 我做错了什么? `import os, shutil, re def rename_file(original_filename): name, extension = os.path.splitext(original_filename) #删除备用点 modified_name = re.sub("\.", r" ", name) modified_name = re. sub("\-", r" ", modified_name) new_filename = modified_name + extension try: # 移动文件或目录(递归) 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('.')]``
  • @RobinHood 你能把它放在你的个人帖子中,还是放在pastebin 中?没有缩进就很难检查出python:P
  • 是的,很抱歉,我不知道如何在此处以正确的格式放置它。巴斯宾:pastebin.com/mEBKr5m4
  • @RobinHood - 我把它缩进了,它对我有用 - 我把脚本放在它自己的目录中,创建了一个文件“lol.g-eo”,从空闲运行脚本,它回信“lol g eo”。您是如何尝试运行脚本的?
  • 我 cd 到目录,然后我 "python /root/rename.py" 我给出的示例有效,但如果我添加其他行,它会失败。是否已将其作为整个脚本的一部分进行尝试?
【解决方案4】:

您也可以将一个叠放在另一个上,但这认为可读性较差

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 2015-12-11
    相关资源
    最近更新 更多