文本处理中常用的正则表达式详解

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)
  1. re.compile()
    功能:
    编译一个正则表达式模式,返回一个正则表达式对象,以便在后续的匹配操作中使用。

  2. re.search(pattern, text, flags=re.DOTALL)
    功能:
    在给定的字符串 text 中搜索第一个与 pattern 匹配的部分。如果找到匹配,则返回一个匹配对象;如果没有找到,则返回 None。
    参数:
    pattern: 正则表达式对象。
    text: 待搜索的字符串。
    flags: 可选参数,re.DOTALL 使得 . 可以匹配换行符。

  3. 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,(),())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值