不区分大小写的正则表达式替换,基于字典

3
抱歉,我无法从谷歌的任何解决方案中找到有效的解决方法(某些网站上的“食谱”很接近,但是太过时了,我没有找到符合我要求的结果。
我正在重命名文件,因此我有一个函数可以输出文件名,我只是使用“test_string”,所以所有点(和下划线)和其他东西都被删除了 - 因为这些是所有这些教授做得不同的最常见的事情,并且使所有这些东西在不删除的情况下变得不可能处理(或查看)。 5个示例:
test_string_1 = 'legal.studies.131.race.relations.in.the.United.States.'

'legal.studies' --> '法律研究'

test_string_2 = 'mediastudies the triumph of bluray over hddvd' 

'mediastudies' --> '媒体研究', 'bluray' --> '蓝光', 'hddvd' --> '高清DVD'

test_string_3 = 'computer Science Microsoft vs unix'

'computer Science' --> '计算机科学', 'unix' --> 'UNIX'

test_string_4 = 'Perception - metamers dts'

'Perception'已经很好了(但谁在意),大局是他们想保留音频信息,所以 'dts' --> DTS。

test_string_5 = 'Perception - Cue Integration - flashing dot example aac20 xvid'

'aac20' --> 'AAC2.0', 'xvid' --> 'XviD'

目前我正在运行类似以下方式的代码:

new_string = re.sub(r'(?i)Legal(\s|-|)Studies', 'Legal Studies', re.sub(r'(?i)Sociology', 'Sociology', re.sub(r'(?i)Media(\s|-|)Studies', 'Media Studies', re.sub(r'(?i)UNIX', 'UNIX', re.sub(r'(?i)Blu(\s|-|)ray', 'Blu-ray', re.sub(r'(?i)HD(\s|-|)DVD', 'HD DVD', re.sub(r'(?i)xvid(\s|-|)', 'XviD', re.sub(r'(?i)aac(\s|-|)2(\s|-|\.|)0', 'AAC2.0', re.sub(r'(?i)dts', 'DTS', re.sub(r'\.', r' ', original_string.title()))))))))))

我把它们都挤在一行上,因为我不经常更改/更新它,而且(我的大脑/注意力缺陷工作方式)在我不再修改此部分后,将其尽可能简化/放到一边更容易做其他事情。

因此,以我的例子为例:

new_test_string_1 = 'Legal Studies 131 Race Relations In The United States'
new_test_string_2 = 'Media Studies The Triumph Of Blu-ray Over HD DVD'
new_test_string_3 = 'Computer Science Microsoft Vs UNIX'
new_test_string_4 = 'Perception - Metamers DTS'
new_test_string_5 = 'Perception - Cue Integration - Flashing Dot Example AAC2.0 XviD'

然而,随着这些替换规则越来越多,我开始希望有一个词典之类的东西--我不想让代码变得太复杂,但我想能够添加新的替换规则以满足实际需要(例如,有很多音频编解码器/容器等,看起来我可能必须把它们都加进去)。至于用什么样的方式来建立这个主列表/字典/或其他东西,我没有意见。

总体而言,我正在修复文件名中的空格和下划线,并使用大写字母替换一堆东西(目前,我普遍采用标题大小写,但在进行re.sub替换时,会处理很多情况,其中大写字母并不完美,输入中可能会有空格、破折号或点,但输出应该没有这些符号)。

同样,最好使用一行命名为lambda函数之类的匿名函数。

附言: 对于一些奇怪的问题和最初缺乏清晰度的问题感到抱歉。我的专业学科大部分内容实际上都相当简单,只有其他课程需要涉及蓝光、HD DVD、DTS、AAC2.0、XviD等。


1
你能提供更多的示例文本吗?至少三个。 - Jack
1
你的例子实际上返回的是“'Legal Studies 131 race relations in the U S'”,而不是“'Legal Studies 131 race relations'”。 - jamylak
@Jack 对不起,我已经做了两次了,每次在提交问题之前都考虑过,决定提供更多的示例会让帮助我的人感到更糟糕而不是更好 - 下次问问题时我一定要确保有很多示例。 = D - user
2个回答

2
>>> import re
>>> def string_fix(text,substitutions):
        text_no_dots = text.replace('.',' ').strip()
        for key,substitution in substitutions.items():
            text_no_dots = re.sub(key,substitution,text_no_dots,flags=re.IGNORECASE)
        return text_no_dots

>>> teststring = 'legal.studies.131.race.relations.in.the.U.S.'
>>> d = {
     r'Legal(\s|-|)Studies' : 'Legal Studies', 
     r'Sociology'           : 'Sociology', 
     r'Media(\s|-|)Studies' : 'Media Studies'
}
>>> string_fix(teststring,d)
'Legal Studies 131 race relations in the U S'

这里有一种更好的方法,不需要使用字典就能完成


>>> teststring = 'legal.studies.131.race.relations.in.the.U.S.'
>>> def repl(match):
        return ' '.join(re.findall('\w+',match.group())).title()

>>> re.sub(r'Legal(\s|-|)Studies|Sociology|Media(\s|-|)Studies',repl,teststring.replace('.',' ').strip(),flags=re.IGNORECASE)
'Legal Studies 131 race relations in the U S'

该死,我现在正在检查第一个示例;但第二个示例似乎可能是在反向顺序中做我试图做的事情?但是我对“repl”使用感到困惑,所以(目前)无法弄清楚如何调整它,如果那是情况的话,因为repl不能是第一个参数。 - user
“repl” 是一种方法,每次找到搜索字符串(例如“法律研究”)时都会调用它来提供替换。它所做的就是找到匹配中的每个单词,并通过空格将它们连接起来。如果单词包含连字符(如您在示例中使用的那样),则需要这样做。然后将其转换为标题(每个单词的第一个字母大写)。它将此作为替换返回。 - jamylak
我刚刚注意到你更新了问题,所以如果单词之间没有任何分隔符,它可能无法工作,但这不是原始示例中的情况。 - jamylak
问题(据我理解)并不是(或者至少还不是)它不能处理分开的单词;而是大写不仅仅是输入字符串的.title(),对吧?(第一个问题中也提到了这一点) - user
从我的替换字典中可以看出,它们都是以标题大小写形式呈现的。 - jamylak
该死,这就是为什么我需要开始听像杰克这样的人,并在我的帖子中提供足够的信息!对不起让你失望了。我不知道是否应该尝试为此提问或在其他地方寻找;但是有没有人有一种未命名变量名称的形式来做到这一点?一个简洁的黄金代码行会更好,也会非常感激(对于我的大脑而言,不一定是速度)。最大的问题(对于所有这些方法来说,真的)是我似乎很难让它返回自己。看起来必须有一些方法可以使用列表推导、lambda等来实现。 - user

1
import re

def string_fix(filename, dict):
    filename = filename.replace('.', ' ')
    for key, val in dict.items():
        filename = re.sub(key, val, filename, flags=re.IGNORECASE)
    return filename

dict = {
         r'Legal[\s\-_]?Studies' : 'Legal Studies',
         r'Media[\s\-_]?Studies' : 'Media Studies',
         r'dts' : 'DTS',
         r'hd[\s\-_]?dvd': 'HD DVD',
         r'blu[\s\-_]?ray' : 'Blu-ray',
         r'unix' : 'UNIX',
         r'aac[\s\-_]?2[\.]?0' : 'AAC2.0',
         r'xvid' : 'XviD',
         r'computer[\s\-_]?science' : 'Computer Science'
     }

string_1 = 'legal.studies.131.race.relations.in.the.United.States.'
string_2 = 'mediastudies the triumph of bluray over hddvd'
string_3 = 'computer Science Microsoft vs unix'
string_4 = 'Perception - metamers dts'
string_5 = 'Perception - Cue Integration - flashing dot example aac20 xvid'

print(string_fix(string_1, dict))
print(string_fix(string_2, dict))
print(string_fix(string_3, dict))
print(string_fix(string_4, dict))
print(string_fix(string_5, dict))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接