-
举例
life is short, i use python # 我要验证这个字符串最后一个单词是不是life # 我想拿到这个字符串中第三个单词, # 都可以通过正则实现 作用:(匹配和截取)给定的字符串是否符合正则表达式的过滤逻辑;可以通过正则表达式,从字符串中获取我们想要的特定部分。
-
re模块使用
# 导入re模块 import re # 使用match方法进行匹配操作 result = re.match(正则表达式,要匹配的字符串) # 如果上一步匹配到数据的话,可以使用group方法来提取数据 result.group() # 第一个re模块函数,match:从字符串的第一个字符开始匹配
# 示例 import re # result = re.match("life", "life is short, i love python") result = re.match("is", "life is short, i use python") print(result) # re.match() 能够匹配出以xxx开头的字符串
-
匹配单个字符
上面我们了解到通过re模块能够完成使用正则表达式来匹配字符串,接下来我们讲解正则表达式的单字符匹配
import re """ 匹配任意一个字符(除了\n) '\r' 回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖; '\n' 换行,换到当前位置的下一行,而不会回到行首; 那就是windows在写入文件的时候把一个\n转换成了\r\n,\r保持不变,记事本只认\r\n [] 匹配[]中列举的一个字符 \d 匹配一个数字,即0-9 \D 匹配非数字 \s 匹配空白,即空格,tab键 \S 匹配非空白 \w 匹配单词字符,即a-z,A-Z,0-9,_ \W 匹配非单词字符 """ ret = re.match(".", "M") # ret = re.match(".|\n", "\n") # ret = re.match(".", "\n", re.S) # 匹配\n的两种方法 # ret = re.match("[.\n]", "\n") print(ret.group()) ret = re.match("t.o", "too") print(ret.group()) ret = re.match("t.o", "two") print(ret.group())
其他的不讲了
-
匹配多个字符
import re """ * 匹配一个字符出现0次或者无限次 + 匹配一个字符出现1次或者无限次 ? 匹配一个字符出现1次或者0次 {m} 匹配一个字符出现m次 {m,n} 匹配一个字符出现m次到n次 """ ret = re.match("A-Z*", "Aabcdef") print(ret.group()) # 题目1:匹配一个字符串是不是163的邮箱地址,且@符号之前有4到20位,例如hello@163.com ret1 = re.match("[a-zA-Z0-9]{4,20}@163.com", "fdfaffafa@163.com") print(ret1.group()) # 注意点 # 1.{}不能有空格,2.\w可以匹配汉字 3..要转义 4.结尾的问题 # 错误示范 ret1 = re.match("\w{4, 20}@163.com", "fdfaffafa@163.com") print(ret1.group())
-
匹配开头结尾
import re """ ^ 匹配字符串开头 $ 匹配字符串结尾 """ # 题目1:匹配出163的邮箱地址,且@符号之前有4到20位,例如hello@163.com ret1 = re.match("\w{4,20}@163\.com$", "fdfaffafa@163.comfaf") print(ret1.group()) # match就是从头开始匹配
-
匹配分组
""" | 匹配左右任意一个表达式 (ab) 将括号中的字符作为一个分组 \num 引用分组num匹配到的字符串 (?P<name>) 分组起别名 (?P=name) 引用别名为name分组匹配到的字符串 """ print("\\n") # | 匹配左右任意一个表达式 ret = re.match("a|b", "a") print(ret.group()) # (ab) 将括号中的字符作为一个分组 ret = re.match("\w{4,20}@(163|126|qq).com", "test@163.com") if ret: print(ret.group(1)) # 如果打印group(1)可以得到分组的结果 else: print("不是163、126、qq邮箱") # 不是163、126、qq邮箱 # \num 引用分组num匹配到的字符串 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()) # 前面加一个r,如果不加r会出现下面的情况 print("<([a-zA-Z])>\w</\1>") # 分组起别名,引用别名的分组 ret = re.match(r"<(\w)><(\w)>.*</\2></\1>", "<html><h1>www.baidu.cn</h1></html>") print(ret.group()) ret = re.match(r"<(?P<name1>\w)><(?P<name2>\w)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.baidu.cn</h1></html>") print(ret.group())
-
re模块的高级用法
import re """ re.match() 能够匹配出以xxx开头的字符串,打印结构需要group() re.search()匹配出现在字符串中任意一个位置的xxx字符,打印结果需要group() re.findall()匹配出现在字符串中所有的xxx字符, re.sub()将匹配到的字符数据进行替换 re.split()根据匹配进行切割字符串,并返回一个列表 """ import re ret = re.search(r"\d+", "阅读次数为 9999") print(ret.group()) # search实现和match一样的功能是只需要在正则表达式前面加^ ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345") print(ret) # 返回一个列表 ret = re.sub(r"\d+", '998', "python = 997, java = 667") print(ret) # 返回替换后的结果 # 比字符串replace的功能强 s = "python = 997, java = 667" print(s.replace("997", "998")) ret = re.split(r":| ", "info:xiaoZhang 33 shandong") print(ret) # 比字符串split功能强 s = "info:xiaoZhang 33 shandong" print(s.split(' '))
转载于:https://my.oschina.net/u/4142063/blog/3058703