如何用Python正则表达式同时替换文件名空格为下划线并添加指定后缀
如何用Python正则表达式同时替换文件名空格为下划线并添加指定后缀
嗨Marc,其实你不需要写太复杂的正则表达式就能完成这个需求——甚至有时候不用正则都可以!我给你两种方案,你可以根据自己的偏好选择:
方案1:拆分操作(更直观易读)
这种方法把两个需求分开处理,先替换空格为下划线,再添加后缀。因为替换单个空格其实用字符串的replace()方法就足够了,比正则更高效且易维护:
string1 = "Using 3 Buttons in PyQt5 DialogButtonBox" # 第一步:替换所有空格为下划线 filename_no_spaces = string1.replace(" ", "_") # 第二步:添加指定后缀 final_filename = f"{filename_no_spaces}_aaa.pdf"
如果未来需要处理多个连续空格的场景,换成正则替换会更通用:
import re filename_no_spaces = re.sub(r"\s+", "_", string1) # \s+匹配一个或多个空白字符(空格、制表符等) final_filename = f"{filename_no_spaces}_aaa.pdf"
方案2:用正则一次性完成
如果你希望用一个正则表达式操作搞定所有事,可以利用正则的替换回调函数。匹配整个字符串后,在回调里同时处理空格替换和后缀添加:
import re string1 = "Using 3 Buttons in PyQt5 DialogButtonBox" # 匹配整个字符串,通过lambda函数完成后续处理 final_filename = re.sub(r"^.*$", lambda m: m.group(0).replace(" ", "_") + "_aaa.pdf", string1)
这里^.*$匹配整个输入字符串,lambda m拿到匹配结果后,先把空格替换为下划线,再拼接_aaa.pdf后缀。
关于你之前尝试的小说明
你之前写的分组(?P<wholeThing>(([A-Za-z0-9]+)([ ]))(x)?)其实没有正确匹配整个文件名(它只能匹配到第一个空格前的内容加空格,还带了一个不必要的可选x)。其实要匹配整个文件名,用你之前单独加后缀时的(?P<wholeThing>.+)就足够了。但纯正则语法很难在一次替换里同时完成“全局替换空格”和“添加后缀”,所以用回调函数或者拆分操作会更合理。
两种方案最终都会得到你想要的结果:Using_3_Buttons_in_PyQt5_DialogButtonBox_aaa.pdf
希望这些方案能帮到你!
备注:内容来源于stack exchange,提问作者Marc B. Hankin
相关产品推荐
相关产品推荐

