运用一:已知字符串a=“aAsmr3idd4bgs7Dlsf9eAF”
(1)请将a字符串中的数字取出,并输出为一个新的字符串,要求使用正则表达式完成;
(2)请将字符串a中的大写字母换为小写,小写字母换成大写。
import re
a="aAsmr3idd4bgs7Dlsf9eAF"
lst=re.compile(r'\d+')
st=lst.findall(a)
st1=''.join(i for i in st)
print(st1)
result = re.sub(r'[a-zA-Z]', lambda x: x.group(0).upper() if x.group(0).islower() else x.group(0).lower(), a)
print(result)
第一小问中规中矩,只要求匹配数字。第二个小问难就难在大小写转换,这里可以灵活运用关键字:lambda,lambda 函数通常会作为参数传递给高阶函数,例如 map()
、filter()
、reduce()
等函数,用于对序列进行转换、筛选、累积等操作。
lambda arguments: expression
arguments是函数的参数列表,用逗号分隔;experession是函数的返回值,也是一个表达式。
result = re.sub(r'[a-zA-Z]', lambda x: x.group(0).upper() if x.group(0).islower() else x.group(0).lower(), a)
其中这句代码的含义就是将正则匹配的内容进行判断,如果是大写,则转变为小写,如果是小写,则转便为大写。
运用二:根据下列字符串构成规律写出正则表达式,实现对测试字符串的搜索。假设待搜索字符串为:小明的身份证号码是 1234567890111,手机号码是 13508826666,私人邮箱是 dailCM@outlook.com,公司邮箱是 123456@qq.com (1)从字符串中提取合法的18位身份证号码;(2)从字符串中提取合法的E-mail地址;(3)从字符串中提取合法的11位手机号码。
我们先分析要匹配的字符串,先分析身份证号码。总共由18位数字构成,前6位表示地区的特别号码,第7、8、9、10位为年份,且7、8位应为19或者20(因为有身份证的人都是19多少年或者20多少年),第11、12位表示月份,则11与12位数字构成的月份只能在01-12之间。第13,14位表示日期,则两位数必须小于31。15、16、17表示任意的3位数字,18位数必须是数字或者字母x。
根据分析就可以开始构造正则表达式:
r'\b[1-9]\d{5}(19|20)\d{2}(0\d|1[0-2])([0-2]\d|3[0-1])\d{3}[0-9X]\b'
接着分析邮箱地址。首先邮箱地址如291434658@qq.com,由5部分组成,在 "@" 符号之前可以是任意的数字或者字母组成的字符串和下划线等字符,可用[a-zA-Z0-9._%+-]表示,接着就是符号 "@" ,然后邮箱的域名部分,可以由英文字母、数字、点、减号组成,且至少包含一个字符。接着就是符号 "." ,可用"\."来进行匹配,最后是邮箱的顶级域名,分为com或cn等,至少有两个字母组成,可用 "[a-zA-Z]{2,}" 匹配
根据分析构造表达式:
r'\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\b
电话号码不多说,特别基础,如果电话号码弄不来的同学建议再回去看下知识点。
编写程序:
import re
lst='小明的身份证号码是 25364720210604002X,手机号码是 13508826666,私人邮箱是 dailCM@outlook.com,公司邮箱是 123456@qq.com'
id_pattern = r'\b[1-9]\d{5}(19|20)\d{2}(0\d|1[0-2])([0-2]\d|3[0-1])\d{3}[0-9X]\b'
id_match = re.search(id_pattern, lst)
if id_match:
print("身份证号码:", id_match.group())
else:
print("未找到身份证号码")
email_pattern = r'\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\b'
email_match = re.search(email_pattern, lst)
if email_match:
print("E-mail 地址:", email_match.group())
else:
print("未找到 E-mail 地址")
phone_pattern = r'\b1[3-9]\d{9}\b'
phone_match = re.search(phone_pattern, lst)
if phone_match:
print("电话号码:", phone_match.group())
else:
print("未找到电话号码")
运行结果:
这样正则表达式的运用就结束啦。