正则表达式

一、概述

  • 概念

比如说:在实际开发中,可以需要验证注册用户的名称是否满足某种(使用字母和下划线),程序员需要对每个用户输入的内容进行规则的对比;

再比如:需要爬取页面中内容,邮箱(xxx@域名)、手机号、图片的链接;

正则表达式就是满足某种规则的一段代码。英文名称:Regular Expression,简称RE

  • 特点

    • 语法比较诡异,可读性很差
    • 通用性很强,绝大多数的编程语法都正则表达式。

二、re模块

# 导入re模块
import re# 使用match函数进行匹配,match默认从开头开始匹配
r = re.match(r'测试', '测试开发57')# 打印匹配结果
print(r.group())        # 测试

三、匹配单个字符

代码 功能
. 匹配任意一个字符,不能匹配\n
[] 匹配[]中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即\n\t
\S 匹配非空白字符
\w 匹配非特殊字符,即a-z、A-Z、0-9、下划线、汉字
\W 匹配特殊字符,即非数字、非字母、非汉字
  • \d\D
# \d
r = re.match(r'测试开发\d', '测试开发57')
print(r.group())r = re.match(r'测试开发\d', '测试开发A')
print(r.group())            # 匹配失败# \D
r = re.match(r'测试开发\D', '测试开发A')
print(r.group())                    # 匹配成功r = re.match(r'测试开发\D', '测试开发!')
print(r.group())                    # 匹配成功
  • \w\W
# \w
r = re.match(r'测试开发\w', '测试开发A')
print(r.group())                    # 匹配成功r = re.match(r'测试开发\w', '测试开发班')
print(r.group())                    # 匹配成功# \W
r = re.match(r'测试开发\W', '测试开发A')
print(r.group())                    # 匹配失败r = re.match(r'测试开发\W', '测试开发\n')
print(r.group())                    # 匹配成功r = re.match(r'测试\W开发', '测试 开发')
print(r.group())                    # 匹配成功
  • \s\S
# \s
r = re.match(r'测试开发\s', '测试开发\n')
print(r.group())                    # 匹配成功r = re.match(r'测试\s开发', '测试\t开发')
print(r.group())                    # 匹配成功# \S
r = re.match(r'测试\S开发', '测试#开发')
print(r.group())                    # 匹配成功
  • []
lst = ['测试开发a', '测试开发e', '测试开发A', '测试开发R', '测试开发5', '测试开发_']
for i in lst:r = re.match(r'测试开发[0-9A-Za-z_]', i)        # 匹配所有的字母和数字if r:print(r.group())else:print(f'{i}----匹配失败')

扩展:[^]:表示对[]中的内容取反。

# lst = ['测试开发a', '测试开发e', '测试开发A', '测试开发R', '测试开发5', '测试开发^']
for i in lst:r = re.match(r'测试开发[^0-9^a-z]', i)if r:print(r.group())else:print(f'{i}----匹配失败')""" 结果:
测试开发a----匹配失败
测试开发e----匹配失败
测试开发A
测试开发R
测试开发5----匹配失败
测试开发^----匹配失败
"""
  • .
import rerst = re.match(r'测试开发.', '测试开发3')
print(rst.group())          # 测试开发3# 使用 .* 匹配多行文本
str1 = """asdf
aaaaaaaaasdfasdf
asdfa
adfadsfsa
asdfasdf
asdfasdf"""rst = re.match(r'.*', str1)     # * 是匹配前一个字符出0次或无数次
print(rst.group())''' 结果:. 不能匹配 \n
asdf
'''# 如何使用 . 匹配\n,那么在match等方法中加入一个参数 re.S
rst = re.match(r'.*', str1, re.S)     # * 是匹配前一个字符出0次或无数次
print(rst.group())''' 结果
asdfaaaaaaaaasdfasdf
asdfa
adfadsfsa
asdfasdf
asdfasdf
'''

四、匹配多个字符

代码 功能
* 匹配前一个字符出现0次或者无数次,即可有可无
+ 匹配前一个字符出现1次或者无数次,即至少一次
? 匹配前一个字符出现0次或者1次
{m} 匹配前一个字符出现m次
{m,n} 匹配前一个字符出现m到n次
  • *
r = re.match(r'\d*', '0123A456789')
print(r.group())r = re.match(r'测试.*', '测试开发57')
print(repr(r.group()))            # '测试开发57'
  • +
r = re.match(r'\d+', '0123456789')
print(r.group())r = re.match(r'\w+', '中国')
print(r.group())r = re.match(r'\w+', '')
print(r.group())            # 报错。匹配失败
  • ?
r = re.match(r'\d?', 'A567')
print(r.group())            # 匹配成功r = re.match(r'\d?', '')
print(r.group())            # 匹配成功
  • {n}
r = re.match(r'\d{6}', '123456789')
print(r.group())                # 123456r = re.match(r'\d{6}', '123')
print(r.group())                # 匹配失败
  • {m,n}
r = re.match(r'\d{2,5}', '123456789')
print(r.group())                # 12345r = re.match(r'\d{2,5}', '1')
print(r.group())
  • 练习:匹配座机号码
number_list = ['023-68237890', '010-68923098', '0913-68681987', '02389891235', '091398783620']for i in number_list:r = re.match(r'0\d{2,3}-?\d{8}', i)if r:print(r.group())else:print(f'{i}---匹配失败!')

五、匹配开头和结尾

代码 功能
^ 匹配字符串开头
$ 匹配字符串结尾
  • ^
"""
需求:匹配以一个数字开头,数字之后跟上python的字符
search():表示任意位置进行匹配
"""lst1 = ['3python', '8ipython', 'python9', '_python', 'A6python','9python123']for i in lst1:r = re.search(r'^\dpython', i)if r:print(r.group())else:print(f'{i}---匹配失败..')
  • $
# 匹配以数字开头,并且以数字结尾,中间字符任意lst1 = ['3python', '8ipython', 'python9', '_python2', 'A6python6','9python123', '3', '12']for i in lst1:r = re.search(r'^\d.*\d$', i)if r:print(r.group())else:print(f'{i}---匹配失败..')
  • ^$:匹配空串
r = re.search(r'^$', '')
print(repr(r.group()))

六、匹配分组

代码 功能
| 匹配左右任意一个表达式
() 将括号中字符作为一个分组
\number 引用分组number匹配
(?P<name>) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串
  • |()
''' 需求
匹配163、qq、gmail邮箱地址,邮箱用户名为6-10位
正则表达式为:[A-Za-z0-9_]{6,10}@(163|qq|gmail)\.com$
'''import relst = ['liupan@163.com', 'liupan@qq.com', 'liupan@gmail']for i in lst:rst1 = re.match(r'[A-Za-z0-9_]{6,10}@(163|qq|gmail)\.com$', 'liupan@163.com')if rst1:print(rst1.group())else:print(f'{i}---匹配失败')

注意:邮箱中的.需要进行转义处理,不然在正则表达式中会当做元字符.匹配任意单个字符!

  • \number:后项引用前项
import restr1 = '<body><h1>我是一级标题</h1></body>'rst1 = re.match(r'<(\w+)><(\w+)>.*</(\1)></(\2)>', str1)
print(rst1.group())
  • (?P<name>)(?P=name)
import restr1 = '<body><h1>我是一级标题</h1></body>'rst1 = re.match(r'<(?P<p1>\w+)><(?P<p2>\w+)>.*</(?P=p2)></(?P=p1)>', str1)
print(rst1.group())

七、贪婪匹配

贪婪和非贪婪:*+{} 后面加上?就是非贪婪。

贪婪匹配:尽可能多地匹配

非贪婪相反,表示尽可能少地匹配

import restr3 = "woniuxywoniuxywoniuxy"
res1 = re.match("w.*y", str3)       # 贪婪匹配
print(res1.group())         # woniuxywoniuxywoniuxyres2 = re.match("w.*?y", str3)      # 非贪婪匹配
print(res2.group())         # woniuxy

八、其它使用方法

  • search:从字符串内开始匹配
'''
匹配出Python = 996里的数字
'''import rerst = re.search(r'\d+', 'Python = 996')
print(rst.group())''' 结果
996
'''
  • findall:匹配字符串中的所有满足规则的字符串,并将匹配结果以列表形式返回
import rerst = re.findall(r'\d+', 'Python=996,java=007,C++=955')
print(rst)''' 结果
['996', '007', '955']
'''
  • sub:替换
  1. 使用字符串进行替换
import rerst = re.sub(r'\d+', '123', 'Python=996,java=107,C++=955')
print(rst)''' 结果
Python=123,java=123,C++=123
'''
  1. 使用函数进行替换
import redef add_sub(tmp):n = int(tmp.group())n += 1return str(n)rst = re.sub(r'\d+', add_sub, 'Python=996,java=107,C++=955')
print(rst)''' 结果
Python=997,java=108,C++=956
'''
  • split:切割
str1 = 'info:python 996 java 007'rst = re.split(r':| ', str1)      # 不要使用()分组
print(rst)''' 结果
['info', 'python', '996', 'java', '007']
'''

通过正则表达式进行切割,使用分组时注意,分组也会作为切割后的列表元素。

Python-24-正则表达式相关推荐

  1. python中正则表达式的简单应用_Python正则表达式详细应用

    原文地址:http://www.jb51.net/article/65286.htm 1.了解正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合, ...

  2. Python中正则表达式用法 重点格式以这个为准_首看_各种问题

    20210811 https://www.jb51.net/article/101258.htm 一.惰性模式的概念: 此模式和贪婪模式恰好相反,它尽可能少的匹配字符以满足正则表达式即可,例如: va ...

  3. python使用正则表达式判别字符串是否以一个大写字符起始而跟随了一些小写字符

    python使用正则表达式判别字符串是否以一个大写字符起始而跟随了一些小写字符 # # Python3 code to find sequences of one upper # case lette ...

  4. python使用正则表达式统计字符串中出现次数最多的数字

    python使用正则表达式统计字符串中出现次数最多的数字 #python使用正则表达式统计字符串中出现次数最多的数字 # find the most occurring element import ...

  5. python使用正则表达式识别大写字母并在大写字母前插入空格

    python使用正则表达式识别大写字母并在大写字母前插入空格 #python使用正则表达式识别大写字母并在大写字母前插入空格 import redef putSpace(input):# regex ...

  6. python使用正则表达式删除字符串中的其它字符只保留数字和字母

    python使用正则表达式删除字符串中的其它字符只保留数字和字母 #python使用正则表达式删除字符串中的其它字符只保留数字和字母 # Python code to demonstrate # to ...

  7. python使用正则表达式寻找具有特定后缀的文件

    python使用正则表达式寻找具有特定后缀的文件 # python使用正则表达式寻找具有特定后缀的文件 # import library import re# list of different ty ...

  8. python使用正则表达式抽取字符串中最大数值数字

    python使用正则表达式抽取字符串中最大数值数字 #python使用正则表达式抽取字符串中最大数值数字 # Function to extract maximum numeric value fro ...

  9. python使用正则表达式去除句子中的重复词

    python使用正则表达式去除句子中的重复词 #python使用正则表达式去除句子中的重复词 # Python program to remove duplicate words # using Re ...

  10. python使用正则表达式检测给定的URL地址是否合法

    python使用正则表达式检测给定的URL地址是否合法 # python使用正则表达式检测给定的URL地址是否合法 # python使用正则表达式检测给定的URL地址是否合法 # Check if a ...

最新文章

  1. OPENCV标定外参
  2. moa 35 批量删除
  3. sklearn.preprocessing.PolynomialFeatures
  4. 信息系统项目管理师在线考试
  5. 【SpringBoot零基础案例09】【IEDA 2021.1】SpringBoot将核心配置文件中的自定义配置映射到一个对象
  6. 猿辅导python面试_猿辅导面试经历—个人感受
  7. NuGet镜像上线试运行
  8. POJ 2348 Euclid's Game(博弈)题解
  9. linux e1000e 网卡驱动,在centos7上安装intel e1000e 网卡驱动
  10. Unet车牌分割,矫正
  11. 异常处理简单例子--python except Exception as e
  12. Android多媒体学习一:Android中Image的简单实例。
  13. Linux 常用系统工具与初始化配置
  14. 什么是Ajax? (转载于疯狂客的BLOG)
  15. 模式识别 算法练习(一)——C均值算法
  16. xp无法远程计算机共享,解决XP局域网共享不能访问的问题
  17. Scala语言会取代Java的吗?
  18. Transformer主干网络——ViT保姆级解析
  19. 阿里云客服机器人人工服务配置文档
  20. hrbust 1611 最强兵力【二维费用完全背包+分类处理】

热门文章

  1. Excel中的中国式排名
  2. ORACLE动态sql在存储过程中出现表或视图不存在的解决方法
  3. C语言中main函数参数使用
  4. Wave Vector and Wavenumber(波矢与波数)
  5. python布尔值的作用_Python基础教程详解布尔变量的作用
  6. 最新版本微信中的QQ音乐会员免费领取
  7. dubbo源码学习(四):暴露服务的过程
  8. Spring 从入门到精通 (二十) 持久层框架 MyBatis
  9. 电动汽车在受控电池能量市场的应用
  10. mysql索引总结一