2012-11-07 171 views
0

我有一個自動生成的參考書目文件存儲我的參考。生成文件中的citekey格式爲xxxxx:2009tb。有沒有辦法使程序檢測到這種模式,並將citekey形式更改爲xxxxx:2009使用python編輯文本文件

+2

使用python regexp,逐行讀取文件並獲取字符串,然後替換它http://www.tutorialspoint.com/python/string_replace.htm – linello

+1

簡單替換:2009tb with:2009將不起作用您? –

+0

只有一個例子很難得到一個模式。你可以發表5到10個不同的出現的這些參考文獻,以及相應的期望輸出。 – heltonbiker

回答

1

我不太清楚你想匹配哪種表達式,但是你可以使用正則表達式來構建一切,使用import re和re.sub,如圖所示。 [0-9] * 4完全匹配4個數字。 (編輯,納入建議)

import re                                               

inf = 'temp.txt'                      
outf = 'out.txt'                      

with open(inf) as f,open(outf,'w') as o:                
    all = f.read()                      
    all = re.sub("xxxxx:[0-9]*4tb","xxxxx:tb",all) # match your regex here             
    o.write(all)                      
    o.close()         
+0

爲什麼將文件分割成幾行?如果你正在採取這種方法,你可以做完整的文件。 – Mark

+0

user996018可能想要捕獲(xxxxxx),而不是替換它。 RParadox,在處理文件而不是'open' /'close'時使用'with'。 –

+0

OP顯然不想替換硬編碼的字符串'xxxxx:2009tb',但實際上是一個PATTERN,其中包含一些(未定義的)字符串,後跟冒號和年份日期以及一些字母。 – heltonbiker

0

實際上,你只是想在基準年後拆除兩個字母。假如我們能夠唯一標識的引用,冒號後面四個數字和兩個字母,比下面的正則表達式會工作(至少它在這個示例代碼工作):

import re 

s = """ 
according to some works (newton:2009cb), gravity is not the same that 
severity (darwin:1873dc; hampton:1956tr). 
""" 

new_s = re.sub('(:[0-9]{4})\w{2}', r'\1', s) 
print new_s 

解釋:「匹配一個冒號:後跟四個數字[0-9]{4}後跟任意兩個「單詞」字符\w{2}。圓括號僅包含要保留的部分,而r'\1'意味着您將用它的較小部分替換每個整個匹配, )括號中的字符串在字符串出現之前的r,因爲有必要將\1解釋爲原始字符串,而不是作爲轉義序列。

希望這有助於!