使用Python正则表达式替换
我需要写一个程序来识别病历中的姓名。如何替换可能包含前缀、后缀和首字母缩写或名字的名称,但不必每次都包含上述所有内容。例如,我可以让程序识别S Smith博士,但不能识别Smith博士 谢谢大家! 以下是我目前的计划:使用Python正则表达式替换,python,regex,substitution,Python,Regex,Substitution,我需要写一个程序来识别病历中的姓名。如何替换可能包含前缀、后缀和首字母缩写或名字的名称,但不必每次都包含上述所有内容。例如,我可以让程序识别S Smith博士,但不能识别Smith博士 谢谢大家! 以下是我目前的计划: # This program removes names and email addresses occurring in a given input file and saves it in an output file. import re def deidentify()
# 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()
中的[A-Z]\.|[A-Z]+项
正在搜索名字或首字母。您希望此部分是可选的,因此请使用捕获组
nameRe = "(Ms\.|Mr\.|Dr\.|Prof\.)( [A-Z](\.|[a-z]+))?( [A-Z][a-z]+)"
re.sub(nameRe, r"\1\4" ,text)
那个?在
表示此部分是可选的,但仍然将其视为捕获组,即使它是空的
r\1\4告诉re.sub使用第一个和第四个捕获组基本上,捕获组在每次看到a时都会启动。请尝试以下操作:
((?:Ms\.|Mr\.|Dr\.|Prof\.|Mrs\.) (?:[A-Z](?:\.|(?:[a-z])+) )?[A-Z][a-z]+)
但是,我建议您将该文件解析为Python数据结构字典、对象等,然后您可以在打印结果时简单地省略名称,更不用说数据进入Python程序后可以做的所有其他方便的事情了,例如,这位患者是否与我们一起工作了五年以上?有多少百分比的患者将信用卡号作为支付信息?结果表明,表达式需要使用\s来解释空格。一旦输入,程序就会工作。我认为这在很大程度上取决于输入文本文件的格式。您的数据是纯文本文件吗?需要反识别的不同可能性有哪些?有前缀还是没有前缀?有或没有首字母?有没有名字?只有姓吗?你的文件中还有其他不应该更改的姓氏吗?皮安:是的,一个txt文件朱利安:所有这些。例如,患者可能第一次被称为Alice Smith女士,但后记仅被称为Smith女士;一个Dr.可能是J.Doe,MD一次,另一次是Dr.Doe我不确定我是否了解如何使用捕获组。如果我从re.sub中去掉名称,我的替换会发生什么?捕获组基本上只是一个匹配项,您可以稍后很容易地引用,通常用于替换。例如,如果我想用Hello Jane替换Hello Fred,问题是我不能用Jane替换每个单词,因为这样我就得到了Jane。因此,我使用捕获组。我的正则表达式是[a-z]+[a-z]+。第一组括号内的匹配是我的第一个捕获组,第二个括号内的匹配是我的第二个捕获组。现在,为了获取Hello Jane,我将其替换为\1 Jane-我使用我的第一个捕获组Hello,一个空格和单词Jane。
re.sub(nameRe, r"\1\4" ,text)
((?:Ms\.|Mr\.|Dr\.|Prof\.|Mrs\.) (?:[A-Z](?:\.|(?:[a-z])+) )?[A-Z][a-z]+)