摘要:意味著字符串必須以結(jié)束。匹配不在方括號(hào)內(nèi)的任意字符中轉(zhuǎn)義字符使用倒斜杠。你需要輸入轉(zhuǎn)義字符,才能打印出一個(gè)倒斜杠。但是,通過(guò)在字符串的第一個(gè)引號(hào)之前加上,可以將該字符串標(biāo)記為原始字符串,它不包括轉(zhuǎn)義字符。
每個(gè)英語(yǔ)學(xué)渣(好吧,其實(shí)這個(gè)說(shuō)的就是學(xué)渣本渣了♀)都有這樣一個(gè)夢(mèng)想: 能夠一邊輕松愉快地看著美劇,一邊自己的英語(yǔ)聽(tīng)力水平還能蹭蹭地往上漲 。知乎上也有很多人分享了自己通過(guò)美劇練習(xí)聽(tīng)力的方法,比如說(shuō) 只開(kāi)英文字幕 或者 干脆就不要字幕 。但是這兩個(gè)方法都有自己的缺點(diǎn),只開(kāi)英文字幕的方法雖然說(shuō)避免了下意識(shí)只看中文,但是卻造成了只看字幕不聽(tīng)讀音,從而練習(xí)了閱讀忽略了聽(tīng)力;不開(kāi)字幕的方法確實(shí)做到了強(qiáng)迫自己必須認(rèn)真聽(tīng),可是對(duì)于很多人來(lái)說(shuō),美劇中充滿了大量的陌生詞匯,比如說(shuō):
這句話中的 betrayal 是背叛的名詞形式,可能很多人就不認(rèn)識(shí),或者說(shuō)認(rèn)識(shí)但是卻沒(méi)聽(tīng)過(guò)他的正確發(fā)音。這樣一來(lái),對(duì)這句話的理解就會(huì)出現(xiàn)障礙。美劇中還有很多類似情況,用這樣的聽(tīng)力材料顯然是不適合的。為了應(yīng)對(duì)這種情況,我有了個(gè)想法:將字幕中的詞匯拆分,并進(jìn)行詞頻的檢測(cè), 如果詞頻在 4000(可以根據(jù)自己的情況進(jìn)行調(diào)整)以內(nèi),則將單詞刪除,如果詞頻在 4000 以外,則多帶帶標(biāo)注出該詞的中文 ,效果如下:
這樣一來(lái),這句話對(duì)于我來(lái)說(shuō)就沒(méi)有任何詞匯上的障礙,假如一遍聽(tīng)不懂,我就可以放心大膽的再聽(tīng)一遍而不必?fù)?dān)心是由于詞匯的問(wèn)題造成的理解障礙。
下面介紹程序的大體思路:
首先觀察字幕文件,選擇后綴名為 srt 的字幕文件用記事本打開(kāi)如下(其他類型的字幕文件用記事本打開(kāi)以后格式非常復(fù)雜,此處不討論):
觀察文本特點(diǎn),撰寫(xiě)相應(yīng)的 正則表達(dá)式 。
雖然在 Python 中使用正則表達(dá)式有幾個(gè)步驟,但每一步都相當(dāng)簡(jiǎn)單。
用import re導(dǎo)入正則表達(dá)式模塊。
用re.compile()函數(shù)創(chuàng)建一個(gè)Regex對(duì)象(記得使用原始字符串)。
向Regex對(duì)象的search()方法傳入想查找的字符串。它返回一個(gè)Match對(duì)象。
調(diào)用Match對(duì)象的group()方法,返回實(shí)際匹配文本的字符串。
常用的匹配規(guī)則:
?匹配零次或一次前面的分組。
*匹配零次或多次前面的分組。
+匹配一次或多次前面的分組。
{n}匹配 n 次前面的分組。
{n,}匹配 n 次或更多前面的分組。
{,m}匹配零次到 m 次前面的分組。
{n,m}匹配至少 n 次、至多 m 次前面的分組。
{n,m}?或*?或+?對(duì)前面的分組進(jìn)行非貪心匹配。
^spam意味著字符串必須以 spam 開(kāi)始。
spam$意味著字符串必須以 spam 結(jié)束。
.匹配所有字符,換行符除外。
d、w和s分別匹配數(shù)字、單詞和空格。
D、W和S分別匹配出數(shù)字、單詞和空格之外的所有字符。
[abc]匹配方括號(hào)內(nèi)的任意字符(諸如 a、b 或 c)。
[^abc]匹配不在方括號(hào)內(nèi)的任意字符
Python中轉(zhuǎn)義字符使用倒斜杠()。字符串" "表示一個(gè)換行字符,而不是倒斜杠加上一個(gè)小寫(xiě)的n。你需要輸入轉(zhuǎn)義字符,才能打印出一個(gè)倒斜杠。所以" "表示一個(gè)倒斜杠加上一個(gè)小寫(xiě)的 n。但是,通過(guò)在字符串的第一個(gè)引號(hào)之前加上r,可以將該字符串標(biāo)記為原始字符串,它不包括轉(zhuǎn)義字符。輸入r"ffffd-ffffd-ffffdd",比輸入"ffffd-ffffd-ffffdd"要容易得多。
由上述相應(yīng)規(guī)則結(jié)合文本特點(diǎn)得到:
#空行、行數(shù)標(biāo)號(hào)正則表達(dá)式 rgx_none_and_num = re.compile(r"d{1,2} ") #時(shí)間正則表達(dá)式 rgx_time = re.compile(r"dd:dd:dd,ffffd --> dd:dd:dd,ffffd ")
之后,因?yàn)橐樵冊(cè)~頻,我在事先已經(jīng)準(zhǔn)備好了詞頻表:
要處理表格,需要用到 openpyxl 模塊,下面是從電子表格文件中讀取單元格涉及的所有函數(shù)、方法和數(shù)據(jù)類型。
導(dǎo)入openpyxl模塊。
調(diào)用openpyxl.load_workbook()函數(shù)。
取得Workbook對(duì)象。
調(diào)用get_active_sheet()或get_sheet_by_name()工作簿方法。
取得Worksheet對(duì)象。
使用索引或工作表的cell()方法,帶上row和column關(guān)鍵字參數(shù)。
取得Cell對(duì)象。
讀取Cell對(duì)象的value屬性。
由上述結(jié)合表格內(nèi)容,建立詞庫(kù)字典:
#詞頻在4000以后的字典: wordlist4001 = {} #事先將名為“1-20000.xlsx”的詞頻表放在當(dāng)前工作目錄 excel_content = openpyxl.load_workbook("1-20000.xlsx") sheet = excel_content["Sheet1"] for row in range(4000,20201): wordlist4001[sheet.cell(row,1).value] = sheet.cell(row,2).value #詞頻在4000以前的字典: wordlist4000 = {} for row in range(1,4001): wordlist4000[sheet.cell(row,1).value] = sheet.cell(row,2).value
所有準(zhǔn)備工作完成后,開(kāi)始讀取字幕文件和處理字幕文件,最后新建一個(gè)處理過(guò)后的字幕文件。完整程序如下:
# -*- coding:utf-8 -*- #導(dǎo)入模塊 import re,openpyxl #讀入字幕文件 text=open("The.Big.Bang.Theory.s05e05.720p.x264.chs&eng.srt","r") #空行、行數(shù)標(biāo)號(hào)正則表達(dá)式 rgx_none_and_num = re.compile(r"d{1,2} ") #時(shí)間正則表達(dá)式 rgx_time = re.compile(r"dd:dd:dd,ffffd --> dd:dd:dd,ffffd ") #處理字幕文件 first_step = text.readlines() #新建一個(gè)字幕文件 new_file = open("C:UsersSYQDesktop處理版.srt","w") #建立4000后的字典 wordlist4001 = {} excel_content = openpyxl.load_workbook("1-20000.xlsx") sheet = excel_content["Sheet1"] for row in range(4000,20201): wordlist4001[sheet.cell(row,1).value] = sheet.cell(row,2).value #建立4000前的字典 wordlist4000 = {} for row in range(1,4001): wordlist4000[sheet.cell(row,1).value] = sheet.cell(row,2).value #挑選出文字行進(jìn)行處理 for line in first_step: #如果為空行,行數(shù)標(biāo)號(hào),則不動(dòng) if rgx_none_and_num.search(line): new_file.write(line) #如果為時(shí)間行則不動(dòng) elif rgx_time.search(line): new_file.write(line) #如果為字幕行,則處理 else: words = line.lower().split() for word in words: #如果單詞不在字典中,則跳過(guò) if word in wordlist4000: pass #如果單詞在字典中,則添加翻譯 elif word not in wordlist4001: pass else: new_word = word + ":" + wordlist4001[word] +" " new_file.write(new_word) #關(guān)閉文件 text.close() new_file.close()
因?yàn)槲乙彩且粋€(gè) python 初學(xué)者,因此在實(shí)現(xiàn)這個(gè)想法的過(guò)程中也遇到了很多問(wèn)題,最后實(shí)現(xiàn)的方法可能也顯得很笨拙,但是最后實(shí)現(xiàn)了還是很開(kāi)心的,哈哈哈。
----------
本文是我們編程教室新春征稿活動(dòng)的一篇投稿,來(lái)自作者 @ 司夜 。他和我們很多讀者一樣,學(xué)習(xí) python 的時(shí)間并不長(zhǎng),但已經(jīng)把 python 應(yīng)用到自己的日常學(xué)習(xí)生活中,并整理成文投稿給我們,這很值得肯定。 在實(shí)踐中應(yīng)用 和 向他人講解 都是非常好的學(xué)習(xí)方式。不用在意自己寫(xiě)的代碼還不夠完善, Done is better than perfect!
我們編程教室會(huì)持續(xù)向所有人開(kāi)放,如果有投稿或參與志愿者的意向,歡迎隨時(shí)在公眾號(hào)里給我們留言。
另外,關(guān)于編程與英語(yǔ)的結(jié)合,我們之前也有過(guò)不少文章,感興趣的可以閱讀:
Crossin:我們用程序整理出了一份Python英語(yǔ)高頻詞匯表,拿走不謝!
分享一個(gè)強(qiáng)大的英漢詞典開(kāi)源數(shù)據(jù)庫(kù)
英語(yǔ) vs 編程
【每周一坑】單詞本 (此系列可在公眾號(hào)“ 每周一坑 ”欄目中查看)
════
其他文章及回答:
學(xué)編程:如何自學(xué)Python | 新手引導(dǎo) | 一圖學(xué)Python
開(kāi)發(fā)案例:智能防擋彈幕 | 紅包提醒 | 流浪地球
歡迎搜索及關(guān)注: Crossin的編程教室
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/43313.html
摘要:能不能省掉這些煩瑣的步驟,讓開(kāi)發(fā)人員自己完成呢現(xiàn)在好了,你可以用和把聊天機(jī)器人接入微信工具資源掘金今晚看了個(gè)電影,回得有點(diǎn)遲。 小花貓-網(wǎng)頁(yè)聊天機(jī)器人 - 前端 - 掘金 基于圖靈機(jī)器人API的網(wǎng)頁(yè)聊天機(jī)器人,輸入二維碼+你要說(shuō)的話有驚喜哦~~~(菜單中的功能尚未開(kāi)發(fā)完成,玩玩聊天功能就好了~)代碼開(kāi)源在https://github.com/ColorfulCa... 了~... (英...
摘要:今天主要說(shuō)一下個(gè)人情況和學(xué)習(xí)路徑規(guī)劃。個(gè)人情況作為浙江新高考最后一屆小白鼠,經(jīng)歷了許許多多手動(dòng)和諧的事情,但是七選三有技術(shù)是唯一好的一件事情,讓我有了一點(diǎn)編程的基礎(chǔ)。 前言 Hello World!這是我思否的第一篇技術(shù)博客(不知道算不算),剛剛經(jīng)歷了高考,有個(gè)10+分的滑鐵盧,現(xiàn)坐標(biāo)浙江杭州,被西南某末流211機(jī)械專業(yè)錄取。雖然被苦x的機(jī)械錄取,但還是對(duì)計(jì)算機(jī)有著幻想。以后想通...
摘要:今天主要說(shuō)一下個(gè)人情況和學(xué)習(xí)路徑規(guī)劃。個(gè)人情況作為浙江新高考最后一屆小白鼠,經(jīng)歷了許許多多手動(dòng)和諧的事情,但是七選三有技術(shù)是唯一好的一件事情,讓我有了一點(diǎn)編程的基礎(chǔ)。 前言 Hello World!這是我思否的第一篇技術(shù)博客(不知道算不算),剛剛經(jīng)歷了高考,有個(gè)10+分的滑鐵盧,現(xiàn)坐標(biāo)浙江杭州,被西南某末流211機(jī)械專業(yè)錄取。雖然被苦x的機(jī)械錄取,但還是對(duì)計(jì)算機(jī)有著幻想。以后想通...
閱讀 1276·2021-10-11 10:59
閱讀 2028·2021-09-29 09:44
閱讀 945·2021-09-01 10:32
閱讀 1491·2019-08-30 14:21
閱讀 1929·2019-08-29 15:39
閱讀 3035·2019-08-29 13:45
閱讀 3598·2019-08-29 13:27
閱讀 2069·2019-08-29 12:27