def input_extract(text, item):
patterns = {
'Sex': r'Sex: (\w+)\n',
'Service': r'Service: (\w+)\n',
'Allergies': r'Allergies:\s*\n(.*?)(?=\n\s*[A-Z_]+[^\n:]+:)',
'Chief Complaint': r'Chief Complaint:\s*\n(.*?)(?=\n\s*[A-Z_]+[^\n:]+:)',
'Major Surgical or Invasive Procedure': r'Major Surgical or Invasive Procedure:\s*\n(.*?)(?=\n\s*[A-Z_]+[^\n:]+:)',
'History of Present Illness': r'History of Present Illness:\s*\n(.*?)(?=Past Medical History:)',
'Past Medical History': r'Past Medical History:\s*\n(.*?)(?=Social History:)',
'Pertinent Results': r'Pertinent Results:\s*\n(.*?)(?=Medications on Admission:|Discharge Medications:|Discharge Disposition:|Discharge Diagnosis:|Discharge Condition:|Followup Instructions:)',
'Medications on Admission': r'Medications on Admission:\s*\n(.*?)(?=Discharge Medications:)',
'Discharge Medications': r'Discharge Medications:\s*\n(.*?)(?=Discharge Disposition:)',
'Discharge Disposition': r'Discharge Disposition:\s*\n(.*?)(?=Discharge Diagnosis:)',
'Discharge Diagnosis': r'Discharge Diagnosis:\s*\n(.*?)(?=Discharge Condition:)',
'Discharge Condition': r'Discharge Condition:\s*\n(.*?)(?=Followup Instructions:)',
}
pattern = patterns.get(item)
if not pattern:
return "Unknown."
match = re.search(pattern, text, flags=re.DOTALL)
首先 ,我们先看一下这个正则表达的模式:patterns= {} {}里面构建的匹配模式是由我们去对应的,先看第一个
'Sex': r'Sex: (\w+)\n', # 主要的知识点 r、(\w+)\n
r在 Python 中,字符串前加 r 表示 原始字符串(raw string),即字符串中的反斜杠 \ 不会被 Python 解释为转义字符。原始字符串对于编写正则表达式、Windows 文件路径等场景非常有用,因为这些场景中常常包含反斜杠
# 普通字符串中,\n 被解释为换行符
s = "Hello\nWorld"
print(s)
Hello
World
s = r"Hello\nWorld"
print(s)
Hello\nWorld
Sex:_ _ _ 这是固定的模式 就是找Sex:后跟着的三个空格的地方 \w 匹配一个字母、数字或下划线的单个字符。 \w+
表示匹配一个或多个字母、数字或下划线的字符序列。 () 用来 捕获 匹配的内容,意味着正则表达式会提取 “Sex:” 后面的单词(例如
“Male” 或 “Female”),并将其作为一个捕获组返回。 \n: 匹配换行符,表示 “Sex:” 后面应该紧跟一个换行符
下一个例子
'Allergies': r'Allergies:\s*\n(.*?)(?=\n\s*[A-Z_]+[^\n:]+:)',
Allergies:
匹配字符串中的 “Allergies:” 这个字段名称(标签)。
\s*: 匹配 “Allergies:” 后面的零个或多个空白字符(包括空格、制表符等),这是为了允许可能存在的任意数量的空白字符。 \n:
匹配一个换行符,表示 “Allergies:” 标签和它的内容是分行的。 (.*?): 这是一个 非贪婪模式 的捕获组,用来匹配
“Allergies” 字段的内容。它会匹配所有字符(包括空格和换行符),但会尽可能少地匹配(即遇到终止条件时会停止)。 .*? 中的
.* 表示匹配任意字符,而 ? 则是非贪婪模式,确保它尽可能少地匹配,直到遇到下一个条件。
(?=\n\s*[A-Z_]+[^\n:]+:): 这是一个
正向先行断言,表示在匹配字段内容时,它要停在满足特定模式的位置,即当遇到新的字段标签时停止匹配。 \n 匹配换行符。 \s*
匹配任意数量的空白字符。 [A-Z_]+ 匹配一个或多个大写字母或下划线,表示新字段的标签通常以大写字母或下划线开头。 [^\n:]+
匹配除换行符和冒号以外的任意字符,表示字段标签后面是一些描述性文字。 : 匹配字段标签后面的冒号。
‘History of Present Illness’: r’History of Present Illness:\s*\n(.*?)(?=Past Medical History:)',
(?=Past Medical History:) 是一个正向前瞻,确保匹配的内容到“Past Medical
History:”为止,但不包括“Past Medical History:”。
最后,介绍几个正则表达式中常用的函数;
pattern = re.compile()
match = re.search(pattern, text, flags=re.DOTALL)
pattern.sub('', text)
-
re.compile()
功能:
编译一个正则表达式模式,返回一个正则表达式对象,以便在后续的匹配操作中使用。 -
re.search(pattern, text, flags=re.DOTALL)
功能:
在给定的字符串 text 中搜索第一个与 pattern 匹配的部分。如果找到匹配,则返回一个匹配对象;如果没有找到,则返回 None。
参数:
pattern: 正则表达式对象。
text: 待搜索的字符串。
flags: 可选参数,re.DOTALL 使得 . 可以匹配换行符。 -
pattern.sub(‘’, text)
功能:
用指定的字符串(在这里是 ‘’,即空字符串)替换字符串 text 中所有与 pattern 匹配的部分。
用法:
示例代码
下面是一个完整的示例,结合了这些方法:
python
复制
import re
编译正则表达式模式
pattern = re.compile(r’\d+') # 匹配数字
text = “Here are some numbers: 123 and 456.”
搜索匹配
match = re.search(pattern, text, flags=re.DOTALL)
if match:
print(“Found number:”, match.group()) # 输出: Found number: 123
替换匹配
new_text = pattern.sub(‘’, text)
print(“Text after substitution:”, new_text) # 输出: Text after substitution: Here are some numbers: and .
总结
re.compile(): 创建正则表达式对象。
re.search(): 在文本中搜索模式,返回第一个匹配。
pattern.sub(): 替换文本中所有匹配的部分。= re.sub(pattern,(),())