不属于Python,是独立于任何编程语言之外的工具
例如markdown 是写博客、笔记的工具
正则简单来说,就是我们按照一定的规则去处理字符串的工具,我们把这个规则叫正则表达式
第一步:导入正则re库
第二步:定义正则的规则,以及需要匹配的字符串
第三步:进行校验,得到结果
# 第一步:导入正则re库 import re # 第二步:定义正则的规则,以及需要匹配的字符串 str = "lili is beautiful lady in the world." # 第三步:定义一个正则规则:提取字符串中的 lili pattern = "lili" # 第四步:使用正则匹配 result = re.match(pattern,str) # 第五步:获取结果 print(result.group()) """ 输出结果: lili 注:result得出的是一个对象 <re.Match object; span=(0, 4), match='lili'> """
re.match(正则规则,匹配的字符串) 1、方法从左往右进行匹配,如果符合规则,就返回对象,如果不符合规则,则返回 None, 2、group()是将匹配到的内容提取出来(从左往右,获取第一次匹配到的内容)
# 查看对象都有什么内容 print(dir(result)) """ 输出结果: ['__class__', '__class_getitem__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'end', 'endpos', 'expand', 'group', 'groupdict', 'groups', 'lastgroup', 'lastindex', 'pos', 're', 'regs', 'span', 'start', 'string'] 这就是这个对象可以使用的方法 """
字符 | 功能 |
---|---|
. | 匹配任意一个字符(除了\n) |
[] | 匹配[ ]中列举的字符 |
\d | 匹配数字,即0—9 |
\D | 匹配非数字,即不是数字 |
\s | 匹配空白,即空格 |
\S | 匹配非空白 |
\w | 匹配单词字符,即a—z,A—Z,0—9,_ |
\W | 匹配非单词字符 |
# 导入re库 import re # 使用 . 匹配任意一个字符(除了\n) print(re.match(".","\neg")) # 输出结果:None print(re.match("...","\neg")) # 输出结果:None print(re.match("...","liliall")) # 输出结果:<re.Match object; span=(0, 3), match='lil'> 匹配了三个字符 print(re.match("....","liliall")) # 输出结果:<re.Match object; span=(0, 4), match='lili'> 匹配了四个字符 # 使用 \d 匹配数字,即0—9 print(re.match("\d","oeihjgo68456")) # 输出结果:None print(re.match("\d\d\d","5982")) # 输出结果:<re.Match object; span=(0, 3), match='598'> # 使用 \D 匹配非数字,即不是数字 print(re.match("\D","845pweg6")) # 输出结果:None print(re.match("\D\D","oeihjgo68456")) # 输出结果:<re.Match object; span=(0, 2), match='oe'> # 使用 \s 匹配空白,即空格 print(re.match("\s","\t845pweg6")) # 输出结果:<re.Match object; span=(0, 1), match='\t'> print(re.match("\s"," 5pweg6")) # 输出结果:<re.Match object; span=(0, 1), match=' '> # 使用 \S 匹配非空白 print(re.match("\S","845pweg6")) # 输出结果:<re.Match object; span=(0, 1), match='8'> # 使用 \w 匹配单词字符,即a—z,A—Z,0—9,_ print(re.match("\w","\t845pweg6")) # 输出结果:None print(re.match("\w","desgfv e")) # 输出结果:<re.Match object; span=(0, 1), match='d'> # 使用 \W 匹配非单词字符 print(re.match("\W","desgfv e")) # 输出结果:None print(re.match("\W","\t845pweg6")) # 输出结果:<re.Match object; span=(0, 1), match='\t'>
用正则匹配手机号
# 导入re库 import re # 用正则匹配手机号 print(re.match("\d\d\d\d\d\d\d\d\d\d\d","93569875256")) """ 输出结果: <re.Match object; span=(0, 11), match='93569875256'> 只能验证是否11个数字 """ # 使用 [] 匹配[ ]中列举的字符 print(re.match("1[3-9]\d\d\d\d\d\d\d\d\d","16669875256"))
\d 可以用[0-9]表示 \D 可以用[^0-9]表示 \w 可以用[a—zA—Z0—9_]表示 \W 可以用[^a—zA—Z0—9_]表示
字符 | 功能 |
---|---|
* | 匹配前一个字符出现0次或者无限次,则可有可无 |
+ | 匹配前一个字符出现1次或者无限次,即至少有1次 |
? | 匹配前一个字符出现1次或者0次,即要么有1次,要么没有 |
{m} | 匹配前一个字符出现m次 |
{m,} | 匹配前一个字符至少出现m次 |
{m,n} | 匹配前一个字符出现从m到n次 |
# 导入re库 import re # 用 * 匹配前一个字符出现0次或者无限次,则可有可无 print(re.match("\d*","e;lgk;;")) # 输出结果:<re.Match object; span=(0, 0), match=''> print(re.match("\d*","0564【prekgh")) # 输出结果:<re.Match object; span=(0, 4), match='0564'> # 用 + 匹配前一个字符出现1次或者无限次,即至少有1次 print(re.match("\d+","e;lgk;;")) # 输出结果:None print(re.match("\d+","0564【prekgh")) # 输出结果:<re.Match object; span=(0, 4), match='0564'> # 用 ? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有,即无限次 print(re.match("\d?","oiujoi")) # 输出结果:<re.Match object; span=(0, 0), match=''> print(re.match("\d?","0564prekgh")) # 输出结果:<re.Match object; span=(0, 1), match='0'> # 混合使用 print(re.match("\d?[a-z]","648oiujoi")) # 输出结果:None print(re.match("\d+[a-z]","648piujoi")) # 输出结果:<re.Match object; span=(0, 4), match='648p'> print(re.match("\d*[a-z]","648piujoi")) # 输出结果:<re.Match object; span=(0, 4), match='648p'> print(re.match("\d*[a-z]+","648piujoi")) # 输出结果:<re.Match object; span=(0, 9), match='648piujoi'> print(re.match("\d*[a-z]+","648*piujoi")) # 输出结果:None # 用 {m,} 匹配前一个字符至少出现m次 print(re.match("\d{3,}","12356987654659")) # 输出结果:<re.Match object; span=(0, 14), match='12356987654659'> print(re.match("\d{3,5}","12356987654659")) # 输出结果:<re.Match object; span=(0, 5), match='12356'> print(re.match("\d{,}","12356987654659")) # 输出结果:<re.Match object; span=(0, 14), match='12356987654659'> print(re.match("\d{,}[a-z]","sgwew")) # 输出结果:<re.Match object; span=(0, 1), match='s'>
* 可以用{,}表示 + 可以用{1,}表示 ?可以用{0,1}表示
升级版:手机号查询
# 导入re库 import re # 手机号 print(re.match("1[3-9]\d{9}","15687986564616")) # 输出结果:<re.Match object; span=(0, 11), match='15687986564'>
字符 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\b | 匹配一个单词的边界 |
\B | 匹配非单词边界 |
注:^在[ ] 里面表示取反,^在[ ] 外面表示以什么开头
# 导入re库 import re # 用 $ 匹配字符串结尾 print(re.match("1[3-9]\d{9}$","13956987269")) """ 输出结果: <re.Match object; span=(0, 11), match='13956987269'> \d{9}$表示从字符串后面数起9位都必须是数字,即以9个数字结尾 """ # 用 ^ 匹配字符串开头 print(re.match("^1[3-9]\d{9}$","13956987269")) """ 输出结果: <re.Match object; span=(0, 11), match='13956987269'> ^1 表示以1开头 """ # 用 \b 匹配一个单词的边界 print(re.match("^\w+an\b","zhangsan")) """ 输出结果: None ^\w+ 表示要以至少有一个单词开头,这时候已经把整个单词匹配完了 """ print(re.match("^\w+an\b","zhangsan an")) """ 输出结果: None 空格没人匹配 """ print(re.match("^\w+\s\\ban\\b","zhangsan an")) print(re.match(r"^\w+\s\ban\b","zhangsan an")) # 输出结果:<re.Match object; span=(0, 11), match='zhangsan an'> print(re.match(r"^.+","zhang san an")) # 输出结果:<re.Match object; span=(0, 11), match='zhang san an'> # 用 \B 匹配非单词边界 print(re.match(r"^\w+\san\B","zhangsan anweljigo635456")) # 输出结果:<re.Match object; span=(0, 11), match='zhangsan an'>
字符 | 功能 |
---|---|
| | 匹配左右任意一个表达式 |
(ob) | 将括号中字符作为一个分组 |
\num | 引用分组num匹配到的字符串 |
(?P<name) | 分组起别名 |
(?P=name) | 引用别名为name分组匹配到的字符串 |
# 导入re库 import re # 需求匹配 0 - 100 之间的数字 # 1 - 99 print(re.match(r"[1-9][1-9]","88")) print(re.match(r"[1-9]\d?","10")) # 0 和 100 print(re.match(r"[1-9]\d?|0$|100$","100")) print(re.match(r"[1-9]?\d?|100$","100"))
# 表达式 | 表达式 # | 表示 或 的意思, or 的意思