以下4道题目为正则表达式相关练习,包括简单的字符匹配、提取文本信息并整合、提取文本信息并替换,以及对常用正则表达式的详细解释
一、 任务描述:模拟对话匹配语句
输入一句字符串,如果字符串中包含了Hi、Hello、你好等包含问候的词时,则回复”Nice to meet you!” 或”你好”否则回复”I do not understand”或”我不知道”,英文字母不区分大小写。
Input_list = ['Shanghai Central Tower is a super-high-rise landmark skyscraper, it is currently the highest floor in China, an area of 433954 square meters, has 118 floors, the total height is 632 meters.',
'Hello,Good morning',
'嘿Siri,早上好,今天天气怎么样?',
'明天应该是风和日丽的一天']
参考代码:
import re
# 自定义函数查找匹配项并打印
def function(input_str):
# 匹配英文字符串中的hi/hello
pattern1 = re.compile(r'([h]i[^a-z]|[h]ello[^a-z])', re.IGNORECASE) # 不区分大小写
# 匹配中文字符串中的你好/早上好
pattern2 = re.compile(r'(早上好|你好)')
match1 = re.search(pattern1, input_str)
match2 = re.search(pattern2, input_str)
if re.search(r'[\u4e00-\u9fa5]', input_str):
if match2:
print('你好!')
else:
print('我不知道。')
else:
if match1:
print('Nice to meet you!')
else:
print('I do not understand.')
# 测试文案
input_list = ['Shanghai Central Tower is a super-high-rise landmark skyscraper, it is currently the highest floor in China, an area of 433954 square meters, has 118 floors, the total height is 632 meters.',
'Hello,Good morning',
'嘿Siri,早上好,今天天气怎么样?',
'明天应该是风和日丽的一天']
# 遍历输出
for input_str in input_list:
function(input_str)
运行输出:
I do not understand.
Nice to meet you!
你好!
我不知道。
二、 任务描述:病历信息抽取
输入一段医疗诊断报告,需要抽取出诊断报告中的[‘肿块部位’, ‘肿块大小’, ‘密度/信号’]。诊断报告有两种格式,根据两种不同格式抽取所需的关键词。
Input_list =
['肿块评估:增强实质期呈稍高密度,大小约85X57mm,位于胰体部、胰尾部。',
'肿块评估:增强实质期呈稍高密度,大小约56X32mm,位于胰体部。',
'肿块评估:胰头部可见肿块,T1WI稍低信号、T2WI稍高信号、DWI轻度受限,增强后可见轻度强化,大小约33X20mm。 ',
'肿块评估:胰头部、胰头钩突部可见肿块,T1WI低信号、T2WI稍高信号、DWI轻度受限,增强后可见轻度强化,大小约17X18mm。']
提示:可用re.match(pattern, text).group()
函数
参考代码:
import re
pattern1 = re.compile(r'肿块评估:增强实质期呈(.+),大小约(\d+X\d+)mm,位于(.+)。')
pattern2 = re.compile(r'肿块评估:(.+)可见肿块,(.+)、DWI轻度受限,增强后可见轻度强化,大小约(\d+X\d+)mm。')
def function(input_str):
# 匹配第一种格式
match1 = re.match(pattern1, input_str)
if match1:
size = match1.group(2)
location = match1.group(3)
density_signal = match1.group(1)
print(f'肿块部位:{location};肿块大小:{size}mm;密度/信号:{density_signal}')
# 匹配第二种格式
match2 = re.match(pattern2, input_str)
if match2:
size = match2.group(3)
density_signal = match2.group(2)
location = match2.group(1)
print(f'肿块部位:{location};肿块大小:{size}mm;密度/信号:{density_signal}')
# 测试文案
input_list = [
'肿块评估:增强实质期呈稍高密度,大小约85X57mm,位于胰体部、胰尾部。',
'肿块评估:增强实质期呈稍高密度,大小约56X32mm,位于胰体部。',
'肿块评估:胰头部可见肿块,T1WI稍低信号、T2WI稍高信号、DWI轻度受限,增强后可见轻度强化,大小约33X20mm。',
'肿块评估:胰头部、胰头钩突部可见肿块,T1WI低信号、T2WI稍高信号、DWI轻度受限,增强后可见轻度强化,大小约17X18mm。'
]
# 遍历输出
for input_str in input_list:
function(input_str)
运行输出:
肿块部位:胰体部、胰尾部;肿块大小:85X57mm;密度/信号:稍高密度
肿块部位:胰体部;肿块大小:56X32mm;密度/信号:稍高密度
肿块部位:胰头部;肿块大小:33X20mm;密度/信号:T1WI稍低信号、T2WI稍高信号
肿块部位:胰头部、胰头钩突部;肿块大小:17X18mm;密度/信号:T1WI低信号、T2WI稍高信号
三、任务描述:解释下列正则表达式,并说明其可能的应用
Example :
正则表达式: ^((?=\S*?[A-Z])(?=\S*?[a-z])(?=\S*?[0-9]).{6,})\S$
表达式解释:
表达式 | 作用 |
---|---|
?=\S*? | 非获取匹配,非贪婪搜素,以任意非空字符作为pattern,匹配其后位置 |
(?=\S*?[A-Z]) | 总的作用是匹配任意非空字符后的一个大写字母。 |
.{6,} | 至少出现6个字符。 |
可能应用:
验证密码强度。匹配长度6位以上,至少包含一个数字,一个大写字母,一个小写字母,不包含空格的字符串。
3.1
^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$
表达式解释:
表达式 | 作用 |
---|---|
^(...) | 匹配字符串的开头 |
13[0-9] | 匹配以"13"开头的手机号码段,后面可以是0-9的任意数字 |
14[01456879] | 匹配以"14"开头的手机号码段,后面可以是0、1、4、5、6、8、9中的任意一个数字 |
15[0-35-9] | 匹配以"15"开头的手机号码段,后面可以是0-3、5-9的任意数字 |
16[2567] | 匹配以"16"开头的手机号码段,后面可以是2、5、6、7中的任意一个数字 |
17[0-8] | 匹配以"17"开头的手机号码段,后面可以是0-8的任意数字 |
18[0-9] | 匹配以"18"开头的手机号码段,后面可以是0-9的任意数字 |
19[0-35-9] | 匹配以"19"开头的手机号码段,后面可以是0-3、5-9的任意数字 |
\d{8} | 匹配接下来的8位数字 |
$ | 标志着匹配结束,后面不能再有任何字符(也就是长度固定为11) |
可能应用:
上述正则表达式可以匹配中国大陆手机号码
3.2
^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]$
表达式解释:
表达式 | 作用 |
---|---|
^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领] | 匹配开头的第一个字符,为中国各省简称 |
[A-Z] | 第二个字符,匹配一个大写英文字母 |
[A-HJ-NP-Z0-9]{4} | 匹配四个字符,可以是除了I和O的大写字母或数字,代表车牌号的后四位 |
[A-HJ-NP-Z0-9挂学警港澳使领] | 匹配一个字符,可以是除了I和O的大写字母、数字,或者“挂学警港澳使领”中的某个字 |
$ | 标志字符串结尾 |
可能应用:
上述正则表达式可以用来匹配中国机动车车牌号
3.3
^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$
表达式解释:
表达式 | 作用 |
---|---|
^[1-9] | 匹配首位为非零的数字 |
\d{3} | 匹配三位数字 |
- | 匹配日期中分隔年月日的短横线,后续的- 作用相同 |
`(0[1-9] | 1[0-2])` |
`(0[1-9] | [1-2][0-9] |
\s+ | 匹配一个或多个空格 |
`(20 | 21 |
: | 匹配冒号,用于分隔时分秒,后续的冒号作用相同 |
[0-5]\d | 匹配00~59分钟 |
[0-5]\d | 匹配00~59秒 |
$ | 标志匹配结束 |
可能应用:
用于匹配特定格式的日期与时间,例如2023-10-07 09:19:33
3.4
(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)
表达式解释:
表达式 | 作用 |
---|---|
(^\d{15}$) | 匹配15位数字 |
(^\d{18}$) | 匹配18位数字 |
`(^\d{17}(\d | X |
可能应用:
可以用来匹配中国大陆15位、18位数字或17位数字且末位为X的身份证号
3.5
^[A-Za-z0-9]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$
表达式解释:
表达式 | 作用 |
---|---|
^[A-Za-z0-9]+ | 匹配电子邮箱的用户名,用户名中可以包含任意长度的英文大小写字母和数字 |
@ | 匹配电子邮箱中的@符号 |
[a-zA-Z0-9_-]+ | 匹配邮箱域名的前半部分,可以包括任意长度的英文大小写字母、数字或短横线 |
(\.[a-zA-Z0-9_-]+)+ | 匹配邮箱域名的后半部分,该部分必须以. 开头,后面可以是任意长度的英文大小写字母、数字或短横线 |
$ | 结束匹配 |
可能应用:
可以匹配电子邮箱地址
3.6
[零一二三四五六七八九]{4}年[零一二三四五六七八九十]{1,2}月[零一二三四五六七八九十]{1,3}日
表达式解释:
表达式 | 作用 |
---|---|
[零一二三四五六七八九]{4}年 | 表示连续匹配四位“零一二三四五六七八九”中的汉字,紧接着匹配“年”字,表示中文格式的年份 |
[零一二三四五六七八九十]{1,2}月 | 表示匹配一位或者连续两位大写数字,紧接着匹配“月”字,表示匹配一到十二月 |
[零一二三四五六七八九十]{1,3}日 | 表示匹配1到3位大写数字,紧接着匹配“日”字,表示匹配一到三十一日 |
可能应用:
可以匹配中文格式的日期,例如“二零二三年九月三十一日”
四、任务描述:使用正则表达式转换文本格式
将下列以美元为单位的金钱数额换成以人民币为单位,汇率按1美元:6人民币。
如: 1.6千亿美元 —> 1208亿人民币
其实针对中国科技劣势,中国为了促进科技发展,早在2006年的时候就发布了国家中长期科学和技术发展规划纲要(2006-2020年)。《规划纲要》确定了核心电子器件、高端通用芯片及基础软件、极大规模集成电路制造技术及成套工艺、新一代宽带无线移动通信、大型飞机、载人航天与探月工程等十六个重大专项,完成时限为十五年左右,这些重大专项是我国到2020年科技发展的重中之重。从目前看在一些领域进步是相当明显的,比如大飞机等,但一些领域还需努力。科学研究领域中国在特种化学品、生物技术、半导体设计、医药(品牌药)等科学研究型领域的四大行业整体处于劣势。这些领域的特点是研发周期长,不是一朝一夕能够追赶上的。个人认为,其中,需要优先努力突破的是半导体设计相关产业,因为该产业经济价值巨大。2015年中国集成电路进口金额2307亿美元,耗费超过原油,成为我国第一大进口商品,出口集成电路金额693亿美元,进出口逆差1613亿美元。2016年中国集成电路进口金额依然高达2296亿美元,出口集成电路金额635亿美元,进出口逆差1.6千亿美元。
提示:
重点是找出美元前的数额和单位,找出数额和单位之后,再找到原文中的位置,然后进行换算进行替换。
可以使用?=
非获取匹配的正则表达式。
参考代码:
import re
input_text = ['其实针对中国科技劣势,中国为了促进科技发展,早在2006年的时候就发布了国家中长期科学和技术发展规划纲要(2006-2020年)。《规划纲要》确定了核心电子器件、高端通用芯片及基础软件、极大规模集成电路制造技术及成套工艺、新一代宽带无线移动通信、大型飞机、载人航天与探月工程等十六个重大专项,完成时限为十五年左右,这些重大专项是我国到2020年科技发展的重中之重。从目前看在一些领域进步是相当明显的,比如大飞机等,但一些领域还需努力。科学研究领域中国在特种化学品、生物技术、半导体设计、医药(品牌药)等科学研究型领域的四大行业整体处于劣势。这些领域的特点是研发周期长,不是一朝一夕能够追赶上的。个人认为,其中,需要优先努力突破的是半导体设计相关产业,因为该产业经济价值巨大。2015年中国集成电路进口金额2307亿美元,耗费超过原油,成为我国第一大进口商品,出口集成电路金额693亿美元,进出口逆差1613亿美元。2016年中国集成电路进口金额依然高达2296亿美元,出口集成电路金额635亿美元,进出口逆差1.6千亿美元。']
input_text = input_text[0];
# 通过该模式匹配出类似于('635', '', '亿'), ('1.6', '.6', '千亿')的结果
pattern = re.compile(r'(\d+(\.\d+)?)(千亿美元|亿美元)')
match = re.findall(pattern, input_text)
for item in match:
# 遍历match,匹配金额和单位
money = item[0]
unit = item[2]
old_text = money + unit # 需要替换的字符串
# 进行汇率转换,注意单位为“千亿”时需要化为“亿”
money = float(money)
if unit == '千亿美元':
money *= 6000
else:
money *= 6
new_text = str(int(money)) + '亿人民币' #准备替换为的新字符串
input_text = input_text.replace(old_text, new_text)
# print(match)
print(input_text)
运行输出:
其实针对中国科技劣势,中国为了促进科技发展,早在2006年的时候就发布了国家中长期科学和技术发展规划纲要(2006-2020年)。《规划纲要》确定了核心电子器件、高端通用芯片及基础软件、极大规模集成电路制造技术及成套工艺、新一代宽带无线移动通信、大型飞机、载人航天与探月工程等十六个重大专项,完成时限为十五年左右,这些重大专项是我国到2020年科技发展的重中之重。从目前看在一些领域进步是相当明显的,比如大飞机等,但一些领域还需努力。科学研究领域中国在特种化学品、生物技术、半导体设计、医药(品牌药)等科学研究型领域的四大行业整体处于劣势。这些领域的特点是研发周期长,不是一朝一夕能够追赶上的。个人认为,其中,需要优先努力突破的是半导体设计相关产业,因为该产业经济价值巨大。2015年中国集成电路进口金额13842亿人民币,耗费超过原油,成为我国第一大进口商品,出口集成电路金额4158亿人民币,进出口逆差9678亿人民币。2016年中国集成电路进口金额依然高达13776亿人民币,出口集成电路金额3810亿人民币,进出口逆差9600亿人民币。