共计 4331 个字符,预计需要花费 11 分钟才能阅读完成。
一、正则基础
1、为什么使用正则
-
需求
判断一个字符串是否是手机号
-
解决
编写一个函数,给函数一个字符串,如果是手机号则返回 True,否则返回 False
-
代码
def isPhone(phone): # 长度为 11 # 全部都是数字字符 # 以 1 开头 pass if isPhone("13812345678"): print("是手机号") else: print("不是手机号") -
注意
如果使用正则会让这个问题变得简单
2、re 模块简介
python 自 1.5 版本开始增加了 re 模块,该模块提供了 perl 风格的正则表达式模式,re 模块是 python 语言拥有了所有正则表达式的功能
- 如下四个方法经常使用
- match()
- search()
- findall()
- finditer()
二、re 模块中常用函数
1、match()函数
-
原型
def match(pattern, string, flags=0) -
功能
尝试从字符串 string 的起始位置匹配一个 pattern 模式,如果不在起始位置匹配成功的话就返回 None
-
参数
参数 说明 pattern 匹配的正则表达式(一种字符串的模式) string 要匹配的字符串 flags 标识位,用于控制正则表达式的匹配方式 -
flags
值 说明 re.I 是匹配对大小写不敏感 re.L 做本地化识别匹配 re.M 多行匹配,影响到 ^ 和 $ re.S 使. 匹配包括换行符在内的所有字符 re.U 根据 Unicode 字符集解析字符,影响 \w、\W、\b、\B re.X 通过给予我们功能灵活的格式以便更好的理解正则表达式 -
代码
import re ret = re.match("www","www.zutuanxue_com.wang") print(ret, type(ret), ret.span()) print(re.match("www","wwW.zutuanxue_com.www.wang", re.I)) print(re.match("www","zutuanxue_com.www.wang")) print(re.match("www","zutuanxue_com.wang"))
2、searce()函数
-
原型
def search(pattern, string, flags=0) -
功能
扫描整个字符串 string,并返回第一个 pattern 模式成功的匹配
-
参数
参数 说明 pattern 匹配的正则表达式(一种字符串的模式) string 要匹配的字符串 flags 标识位,用于控制正则表达式的匹配方式 -
flags
值 说明 re.I 是匹配对大小写不敏感 re.L 做本地化识别匹配 re.M 多行匹配,影响到 ^ 和 $ re.S 使. 匹配包括换行符在内的所有字符 re.U 根据 Unicode 字符集解析字符,影响 \w、\W、\b、\B re.X 通过给予我们功能灵活的格式以便更好的理解正则表达式 -
代码
import re ret = re.search("www", "zutuanxue_com.www.wang.www") print(ret, type(ret), ret.span())
3、findall()函数
-
原型
def findall(pattern, string, flags=0) -
功能
扫描整个字符串 string,并返回所有匹配的 pattern 模式结果的字符串列表
-
参数
参数 说明 pattern 匹配的正则表达式(一种字符串的模式) string 要匹配的字符串 flags 标识位,用于控制正则表达式的匹配方式 -
flags
值 说明 re.I 是匹配对大小写不敏感 re.L 做本地化识别匹配 re.M 多行匹配,影响到 ^ 和 $ re.S 使. 匹配包括换行符在内的所有字符 re.U 根据 Unicode 字符集解析字符,影响 \w、\W、\b、\B re.X 通过给予我们功能灵活的格式以便更好的理解正则表达式 -
代码
import re ret = re.findall("www", "zutuanxue_com.www.wang.wwwqqww1fffwwe") print(ret, type(ret)) # ww1 ww2 ww3 ww4 wwa wwb wwc ww@ print(re.findall("", "zutuanxue_com.www.wang.wwwqqww1fffwwe"))
4、finditer()函数
-
原型
def finditer(pattern, string, flags=0) -
功能
与 findall()类似,返回一个迭代器
-
参数
参数 说明 pattern 匹配的正则表达式(一种字符串的模式) string 要匹配的字符串 flags 标识位,用于控制正则表达式的匹配方式 -
flags
值 说明 re.I 是匹配对大小写不敏感 re.L 做本地化识别匹配 re.M 多行匹配,影响到 ^ 和 $ re.S 使. 匹配包括换行符在内的所有字符 re.U 根据 Unicode 字符集解析字符,影响 \w、\W、\b、\B re.X 通过给予我们功能灵活的格式以便更好的理解正则表达式 -
代码
import re ret = re.finditer("www", "zutuanxue_com.www.wang.wwwqqww1fffwwe") print(ret, type(ret)) for x in ret: print(x, type(x), x.span())
三、正则表达式元字符
1、匹配单个字符与数字
| 匹配 | 说明 |
|---|---|
| . | 匹配除换行符以外的任意字符,当 flags 被设置为 re.S 时,可以匹配包含换行符以内的所有字符,如果没有设置并且还匹配所有字符需要[.\n] |
| [] | 里面是字符集合,匹配 [] 里任意一个字符 |
| [0123456789] | 匹配任意一个数字字符 |
| [0-9] | 匹配任意一个数字字符 |
| [a-z] | 匹配任意一个小写英文字母字符 |
| [A-Z] | 匹配任意一个大写英文字母字符 |
| [A-Za-z] | 匹配任意一个英文字母字符 |
| [A-Za-z0-9] | 匹配任意一个数字或英文字母字符 |
| [^zutuanxue_com] | []里的 ^ 称为脱字符,表示非,匹配不在 [] 内的任意一个字符 |
| \d | 匹配任意一个数字字符,相当于[0-9] |
| \D | 匹配任意一个非数字字符,相当于[^0-9] |
| \w | 匹配字母、下划线、数字中的任意一个字符,相当于[0-9A-Za-z_] |
| \W | 匹配非字母、下划线、数字中的任意一个字符,相当于[^0-9A-Za-z_] |
| \s | 匹配空白符(空格、换页、换行、回车、制表),相当于[\f\n\r\t] |
| \S | 匹配非空白符(空格、换页、换行、回车、制表),相当于[^ \f\n\r\t] |
impor re
print(re.findall(r"ww\d", "zutuanxue_com.www.wang.wwwqqww1fww\nffwweeeww3"))
print(re.findall(r"ww.", "zutuanxue_com.www.wang.wwwqqww1fww\nffwwe", re.S))
2、匹配锚字符
| 匹配 | 说明 |
|---|---|
| ^ | 行首匹配,和 [] 里的 ^ 不是一个意思 |
| $ | 行尾匹配 |
import re
print(re.search(r"^zutuanxue_com","zutuanxue_com is a good man"))
print(re.search(r"^zutuanxue_com","a zutuanxue_com is a good man"))
print(re.search(r"man$","zutuanxue_com is a good man"))
print(re.search(r"^man$","man"))
s = '''zutuanxue_com is a good man
zutuanxue_com is a nice man
zutuanxue_com is a cool man
kaige is a good man
zutuanxue_com is a handsome man
'''
print("-----------------------")
ret = re.finditer(r"^zutuanxue_com", s, re.M)
for x in ret:
print(x)
3、匹配边界字符
| 匹配 | 说明 |
|---|---|
| \A | 匹配字符串的开始,和 ^ 的区别是 \A 只匹配整个字符串的开头,即使在 re.M 模式下也不会匹配其他行的行首 |
| \Z | 匹配字符串的结尾,和 $ 的区别是 \Z 只匹配整个字符串的结尾,即使在 re.M 模式下也不会匹配其他行的行尾 |
| \b | 匹配一个单词的边界,指单词和空格的位置 |
| \B | 匹配非单词边界 |
import re
print(re.findall(r"\Azutuanxue_com", s, re.M))
print(re.findall(r"ck\b", "zutuanxue_com is a good man! ack is a nice mack,nckab"))
ret = re.finditer(r"ck\B", "zutuanxue_com is a good man! ack is a nice manckab")
for x in ret:
print(x)
4、匹配多个字符
说明:以下使用 x、y、z 均为假设的普通字符,m、n 表示一个数字,不是正则表达式的元字符
| 匹配 | 说明 |
|---|---|
| (xyz) | 匹配括号内的 xyz,作为一个整体去匹配 |
| x? | 匹配 0 个或者 1 个 x,非贪婪匹配 |
| x* | 匹配 0 个或任意多个 x |
| x+ | 匹配至少一个 x |
| x{n} | 确定匹配 n 个 x,n 是非负数 |
| x{n,} | 至少匹配 n 个 x |
| x{n,m} | 匹配至少 n 个最多 m 个 x |
| x|y | | 表示或的意思,匹配 x 或 y |
import re
print(re.findall(r"(very)", "zutuanxue_com is a very very good man"))
print(re.findall(r"a?", "11111a2222aa3333aaa44444aaaa55555"))
print(re.findall(r"a*", "11111a2222aa3333aaa44444aaaa55555"))
print(re.findall(r"a+", "11111a2222aa3333aaa44444aaaa55555"))
print(re.findall(r"a{2}", "11111a2222aa3333aaa44444aaaa55555"))
print(re.findall(r"a{3,}", "11111a2222aa3333aaa44444aaaa55555"))
print(re.findall(r"a{3,5}", "11111a2222aa3333aaa44444aaaa55555aaaaa666aaaaaa"))
print(re.findall(r"((s|S)unck)", "zutuanxue_com is a good manzutuanxue_com"))
print(re.findall(r"(zutuanxue_com|zutuanxue_com)", "zutuanxue_com is a good manzutuanxue_com"))
正文完
星哥玩云-微信公众号






