2015-04-03 196 views
0

我需要編寫一個程序來識別醫療記錄中的名字。我該如何替換可能包含前綴,後綴和首字母或名字的名稱,但不必每次都有上述所有內容。例如,我可以讓程序去識別史密斯博士,但不是史密斯博士。使用Python正則表達式替換

謝謝!

這裏的節目,我到目前爲止有:

# This program removes names and email addresses occurring in a given input file and saves it in an output file. 

import re 
def deidentify(): 
    infilename = input("Give the input file name: ") 
    outfilename = input("Give the output file name: ") 

    infile = open(infilename,"r") 
    text = infile.read() 
    infile.close() 

    # replace names 
    nameRE = "(Ms\.|Mr\.|Dr\.|Prof\.) [A-Z](\.|[a-z]+) [A-Z][a-z]+" 
    deidentified_text = re.sub(nameRE,"**name**",text) 



    outfile = open(outfilename,"w") 
    print(deidentified_text, file=outfile) 
    outfile.close() 

deidentify() 
+0

我認爲這在很大程度上取決於輸入文本文件的格式。你的數據是純文本文件嗎? – pyan 2015-04-03 18:18:15

+0

需要去識別的不同可能性有哪些?有或沒有前綴?有或沒有縮寫?有沒有名字?只有姓氏?你的文件中是否有其他姓氏不應該改變? – 2015-04-03 18:21:14

+0

Pyan:是的,一個txt文件 – Ellis5 2015-04-03 19:09:36

回答

0

[A-Z](\.|[a-z]+)術語

"(Ms\.|Mr\.|Dr\.|Prof\.) [A-Z](\.|[a-z]+) [A-Z][a-z]+" 

正在尋找一個名字或首字母。你希望這部分是可選的,所以使用捕獲組。

nameRe = "(Ms\.|Mr\.|Dr\.|Prof\.)([A-Z](\.|[a-z]+))?([A-Z][a-z]+)" 
re.sub(nameRe, r"\1\4" ,text) 

?

re.sub(nameRe, r"\1\4" ,text) 

說:「這部分是可選的,但還是把它當作即使它是空的捕捉組。」

r"\1\4"告訴re.sub使用第一個和第四個捕獲組(基本上,一個捕獲組開始evey時間,你會看到一個()。

+0

我不確定我瞭解如何使用捕獲組。 – Ellis5 2015-04-03 19:13:46

+0

如果我從re.sub中取出** name **,我的替換會發生什麼? – Ellis5 2015-04-03 21:12:37

+0

捕獲組基本上只是一個匹配,您可以稍後輕鬆參考,通常用於替換。例如,如果我想用「Hello Jane」替換「Hello Fred」,問題是我不能用「Jane」替換每個單詞,因爲那樣我會得到「Jane Jane」。相反,我使用捕獲組。我的正則表達式是「([a-z] +)([a-z] +)」。第一組括號內的匹配是我的第一個捕獲組,第二個內部是我的第二個捕獲組。現在,要獲得「Hello Jane」,我用「\ 1 Jane」替換 - 我使用我的第一個捕獲組,「Hello」,一個空格,以及「Jane」這個詞。 – Travis 2015-04-06 18:21:52

0

嘗試以下操作:

((?:Ms\.|Mr\.|Dr\.|Prof\.|Mrs\.) (?:[A-Z](?:\.|(?:[a-z])+))?[A-Z][a-z]+) 

不過,我建議你解析這個文件放到一個Python數據結構(字典,對象,等等),然後你可以簡單地在打印結果忽略的名字,更不用說一旦你的數據在Python程序中,你可以做的其他所有其他便利的事情(例如,這個病人與我們在一起超過五年?有多少病人有信用卡號碼作爲支付信息?)。

0

原來的答案是表達式需要用\ s來解釋空格。一旦輸入,程序就可以運行。