ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

正则表达式

2022-04-18 01:33:31  阅读:176  来源: 互联网

标签:__ 输出 匹配 正则表达式 re print match


什么是正则表达式?

不属于Python,是独立于任何编程语言之外的工具

例如markdown 是写博客、笔记的工具

正则简单来说,就是我们按照一定的规则去处理字符串的工具,我们把这个规则叫正则表达式

如何在Python中使用正则表达式?

第一步:导入正则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 的意思

标签:__,输出,匹配,正则表达式,re,print,match
来源: https://www.cnblogs.com/Pork-belly8/p/16158037.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有