正则表达式概述 1 re模块的使用过程 # 导入re模块 import re # 使用match方法进行匹配操作 result = re.match(正则表达式,要匹配的字符串) # 如果上一步匹配到数据的话,可以使用group方法来提取数据 result.group() 2 re模块示例(匹配以itcast开头的语句)
import re
result = re.match("itcast" ,"itcast.cn")
print(result.group())
3 说明 re.match() 能够匹配出以xxx开头的字符串匹配单个字符 在上一小节中,了解到通过re模块能够完成使用正则表达式来匹配字符串 本小节,将要讲解正则表达式的单字符匹配 例1
import re
ret = re.match(".", "M")
print(ret.group())
ret = re.match("t.o", "too")
print(ret.group())
ret = re.match("t.o", "two")
print(ret.group())
例2
import re
ret = re.match("h", "hello Python")
print(ret.group())
ret = re.match("H", "Hello Python")
print(ret.group())
ret = re.match("[hH]", "hello Python")
print(ret.group())
ret = re.match("[hH]", "Hello Python")
print(ret.group())
ret = re.match("[hH]ello Python", "Hello Python")
print(ret.group())
ret = re.match("[0123456789]Hello Python", "7Hello Python")
print(ret.group())
ret = re.match("[0-9]Hello Python", "7Hello Python")
print(ret.group())
ret = re.match("[0-35-9]Hello Python", "7Hello Python")
print(ret.group())
ret = re.match("[0-35-9]Hello Python", "4Hello Python")
print(ret)
例3:
import re
ret = re.match("嫦娥1号", "嫦娥1号发射成功")
print(ret.group())
ret = re.match("嫦娥2号", "嫦娥2号发射成功")
print(ret.group())
ret = re.match("嫦娥3号", "嫦娥3号发射成功")
print(ret.group())
ret = re.match("嫦娥\d号", "嫦娥1号发射成功")
print(ret.group())
ret = re.match("嫦娥\d号", "嫦娥2号发射成功")
print(ret.group())
ret = re.match("嫦娥\d号", "嫦娥3号发射成功")
print(ret.group())
匹配多个字符 匹配多个字符的相关格式: 例1:
import re
ret = re.match("[A-Z][a-z]*", "M")
print(ret.group())
ret = re.match("[A-Z][a-z]*", "MnnM")
print(ret.group())
ret = re.match("[A-Z][a-z]*", "Aabcdef")
print(ret.group())
例2:
import re
names = ["name1", "_name", "2_name", "__name__"]
for name in names:
ret = re.match("[a-zA-Z_]+[\w]*", name)
if ret:
print("变量名 %s 符合要求" % ret.group())
else:
print("变量名 %s 非法" % name)
例3:
import re
ret = re.match("[1-9]?[0-9]", "7")
print(ret.group())
ret = re.match("[1-9]?\d", "33")
print(ret.group())
ret = re.match("[1-9]?\d", "09")
print(ret.group())
例4:
import re
ret = re.match("[a-zA-Z0-9_]{6}", "12a3g45678")
print(ret.group())
ret = re.match("[a-zA-Z0-9_]{8,20}", "1ad12f23s34455ff66")
print(ret.group())
练一练 题目1:匹配出163的邮箱地址,且@符号之前有4到20位,例如hello@163.com 匹配开头结尾 例1
import re
email_list = ["xiaoWang@163.com", "xiaoWang@163.comheihei", ".com.xiaowang@qq.com"]
for email in email_list:
ret = re.match("[\w]{4,20}@163\.com", email)
if ret:
print("%s 是符合规定的邮件地址,匹配后的结果是:%s" % (email, ret.group()))
else:
print("%s 不符合要求" % email)
完善后:
import re
email_list = ["xiaoWang@163.com", "xiaoWang@163.comheihei", ".com.xiaowang@qq.com"]
for email in email_list:
ret = re.match("[\w]{4,20}@163\.com$", email)
if ret:
print("%s 是符合规定的邮件地址,匹配后的结果是:%s" % (email, ret.group()))
else:
print("%s 不符合要求" % email)
匹配分组: 例1:
import re
ret = re.match("[1-9]?\d", "8")
print(ret.group())
ret = re.match("[1-9]?\d", "78")
print(ret.group())
ret = re.match("[1-9]?\d", "08")
print(ret.group())
ret = re.match("[1-9]?\d$", "08")
if ret:
print(ret.group())
else:
print("不在0-100之间")
ret = re.match("[1-9]?\d$|100", "8")
print(ret.group())
ret = re.match("[1-9]?\d$|100", "78")
print(ret.group())
ret = re.match("[1-9]?\d$|100", "08")
print(ret)
ret = re.match("[1-9]?\d$|100", "100")
print(ret.group())
例2:
import re
ret = re.match("\w{4,20}@163\.com", "test@163.com")
print(ret.group())
ret = re.match("\w{4,20}@(163|126|qq)\.com", "test@126.com")
print(ret.group())
ret = re.match("\w{4,20}@(163|126|qq)\.com", "test@qq.com")
print(ret.group())
ret = re.match("\w{4,20}@(163|126|qq)\.com", "test@gmail.com")
if ret:
print(ret.group())
else:
print("不是163、126、qq邮箱")
不是以4、7结尾的手机号码(11位)
import re
tels = ["13100001234", "18912344321", "10086", "18800007777"]
for tel in tels:
ret = re.match("1\d{9}[0-35-68-9]", tel)
if ret:
print(ret.group())
else:
print("%s 不是想要的手机号" % tel)
提取区号和电话号码:
import re
ret = re.match("([^-]*)-(\d+)","010-12345678")
print(ret.group())
print(ret.group(1))
print(ret.group(2))
例3 匹配出<html>hh</html>
import re
ret = re.match("<[a-zA-Z]*>\w*</[a-zA-Z]*>", "<html>hh</html>")
print(ret.group())
ret = re.match("<[a-zA-Z]*>\w*</[a-zA-Z]*>", "<html>hh</htmlbalabala>")
print(ret.group())
ret = re.match(r"<([a-zA-Z]*)>\w*</\1>", "<html>hh</html>")
print(ret.group())
test_label = "<html>hh</htmlbalabala>"
ret = re.match(r"<([a-zA-Z]*)>\w*</\1>", test_label)
if ret:
print(ret.group())
else:
print("%s 这是一对不正确的标签" % test_label)
例4:\number 匹配出<html><h1>www.itcast.cn</h1></html>
import re
labels = ["<html><h1>www.itcast.cn</h1></html>", "<html><h1>www.itcast.cn</h2></html>"]
for label in labels:
ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", label)
if ret:
print("%s 是符合要求的标签" % ret.group())
else:
print("%s 不符合要求" % label)
例5(?P<name>) (?P=name) 匹配出`
www.itcast.cn
` 注意:(?P)和(?P=name)中的字母p大写
import re
ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.itcast.cn</h1></html>")
print(ret.group())
ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.itcast.cn</h2></html>")
print(ret)
re模块的高级用法 search 需求:匹配出文章阅读的次数
import re
ret = re.search(r"\d+", "阅读次数为 9999")
print(ret.group())
findall 需求:统计出python、c、c++相应文章阅读的次数
import re
ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
print(ret)
sub 将匹配到的数据进行替换 需求:将匹配到的阅读次数加1
方法1:
import re
ret = re.sub(r"\d+", '998', "python = 997")
print(ret)
方法2:
import re
def add(temp):
strNum = temp.group()
num = int(strNum) + 1
return str(num)
ret = re.sub(r"\d+", add, "python = 997")
print(ret)
ret = re.sub(r"\d+", add, "python = 99")
print(ret)
split 根据匹配进行切割字符串,并返回一个列表 需求:切割字符串“info:xiaoZhang 33 shandong”
import re
ret = re.split(r":| ", "info:xiaoZhang 33 shandong")
print(ret)
python贪婪和非贪婪 Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;
非贪婪则相反,总是尝试匹配尽可能少的字符。
在"*“,”?“,”+“,”{m,n}"后面加上?,使贪婪变成非贪婪
import re
s="This is a number 234-235-22-423"
r=re.match(".+(\d+-\d+-\d+-\d+)",s)
print(r.group(1))
r=re.match(".+?(\d+-\d+-\d+-\d+)",s)
print(r.group(1))
正则表达式模式中使用到通配字,那它在从左到右的顺序求值时,会尽量“抓取”满足匹配最长字符串,在我们上面的例子里面,“.+”会从字符串的启始处抓取满足模式的最长字符,其中包括我们想得到的第一个整型字段的中的大部分,“\d+”只需一位字符就可以匹配,所以它匹配了数字“4”,而“.+”则匹配了从字符串起始到这个第一位数字4之前的所有字符。
解决方式:非贪婪操作符“?”,这个操作符可以用在"*“,”+“,”?"的后面,要求正则匹配的越少越好
import re
print(re.match(r"aa(\d+)","aa2343ddd").group(1))
print(re.match(r"aa(\d+?)","aa2343ddd").group(1))
print(re.match(r"aa(\d+)ddd","aa2343ddd").group(1))
print(re.match(r"aa(\d+?)ddd","aa2343ddd").group(1))
r的作用: Python中字符串前面加上 r 表示原生字符串,
与大多数编程语言相同,正则表达式里使用""作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"“,那么使用编程语言表示的正则表达式里将需要4个反斜杠”\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。
Python里的原生字符串很好地解决了这个问题,有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观
import re
mm = "c:\\a\\b\\c"
ret = re.match(r"c:\\a",mm).group()
print(ret)
|