Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python正则表达式替换_Python_Regex_Substitution - Fatal编程技术网

使用Python正则表达式替换

使用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()

我需要写一个程序来识别病历中的姓名。如何替换可能包含前缀、后缀和首字母缩写或名字的名称,但不必每次都包含上述所有内容。例如,我可以让程序识别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():
    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]+)