3

很抱歉,但我无法从谷歌给我的任何解决方案中找到可行的解决方案(某些网站上的一些“食谱”非常接近,但是太旧了,我还没有找到任何东西这给了我正在寻找的结果。

我正在重命名文件,所以我有一个吐出文件名的函数,为此我只是使用'test_string's:所以,首先删除所有点,(和下划线)和东西 - 因为这些是最常见的所有这些教授所做的事情都不同,并且如果不删除所有这些东西就无法处理(或查看)。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' --> 'HD DVD'

test_string_3 = 'computer Science Microsoft vs unix'

'计算机科学' --> '计算机科学'、'unix' --> 'UNIX'

test_string_4 = 'Perception - metamers dts'

“感知”已经很好了(但谁在乎),大局是他们希望将音频信息保留在那里,所以“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()))))))))))

我把它们全部放在一条线上;因为我没有太多改变/更新它,而且(我的大脑/ADD 的工作方式)一旦我不乱做其他事情,就更容易让它尽可能少/不碍事这部分了。

所以,以我的例子:

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.subs 之外,普遍使用标题,它处理大量大写不完美且输入中可能有也可能没有空格、破折号或点的情况下,输出应该有)。

类似地,一个单行的、未命名的(例如 lambda)函数会更可取。

PS 很抱歉有些奇怪和一些最初的不清楚。这里的问题之一是在我的专业/学习中,大多数东西实际上非常简单,其他课程需要所有蓝光、HD DVD、DTS、AAC2.0、XviD 等。

4

2 回答 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'
于 2012-04-22T06:07:13.077 回答
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))
于 2012-04-22T21:57:12.657 回答