正则表达式

正则表达式与re模块简介

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern)
正则表达式是一个 模糊的 匹配(不是精准匹配)
re: python自1.5版本开始增加了re模块,该模块提供了perl风格的正则表达式,re模块是python中所有正则表达式的功能


如下四个方法经常使用

  • match()
  • search()
  • findall()
  • finditer()

正则表达式

.               匹配除换行符以外的任意字符
[]              里面是字符集合,匹配[]里任意一个字符
[0123456789]    匹配任意一个数字字符
[0-9]           匹配任意一个数字字符
[a-z]           匹配任意一个小写英文字母字符
[A-Z]           匹配任意一个大写英文字母字符
[A-Za-z]        匹配任意一个英文字母字符
[A-Za-z0-9]     匹配任意一个数字或英文字母字符
[^lucky]        []里的^称为脱字符,表示非,匹配不在[]内的任意一个字符
^[lucky]        以[]中内的某一个字符作为开头
\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]
*               匹配0次到任意次
+               匹配1次以上

match()函数

原型

def match(pattern, string, flags=0)

功能

匹配成功返回匹配的对象
匹配失败返回None

获取匹配结果

使用group()方法获取到匹配的值
groups() 返回一个包含所有小组字符串的元组, 从 1 到所含的小组号

参数
参数            说明
pattern         匹配成功的正则表达式(一种字符串的模式)
string          要匹配的字符串
flags           标记位, 用于控制正则表达式的匹配方式
特点

只匹配一次,必须从第一位开始,类似于search(“^”)

测试
import re #导入re正则模块
print(re.match("a", '123456'))  #None
print(re.match("[a-z]", '123x456')) #None
print(re.match("^1[3-9][0-9]{9}$", '19350302289'))  #<re.Match object; span=(0, 11), match='19350302289'>
print(re.match("^1[3-9][0-9]{9}$", '19350302289').group())  #19350302289

search()函数

原型:

def search(pattern, string, flag=0)

功能

扫描整个字符串string, 并返回第一个pattern模式成功的匹配
匹配失败返回 None

参数
参数            说明
pattern         匹配成功的正则表达式(一种字符串的模式)
string          要匹配的字符串
flags           标记位, 用于控制正则表达式的匹配方式
特点

只匹配一次,匹配任意位置

测试
import re #导入re正则模块
print(re.search("a", '123456'))     #None
print(re.search("[a-z]", '123x456'))    #<re.Match object; span=(3, 4), match='x'>
print(re.search("^1[3-9][0-9]{9}$", '19350302289')) #<re.Match object; span=(0, 11), match='19350302289'>
print(re.search("^1[3-9][0-9]{9}$", '19350302289').group()) #19350302289

findall()函数

原型:

def findall(pattern, string, flag=0)

功能

扫描整个字符串string, 并返回所有匹配的pattern模式结果的字符串列表

参数
参数            说明
pattern         匹配成功的正则表达式(一种字符串的模式)
string          要匹配的字符串
flags           标记位, 用于控制正则表达式的匹配方式
特点

多次匹配,匹配任意位置

测试
import re #导入re正则模块
print(re.findall("<b>.*</b", '<b>测试</b><b>测试01</b><b>测试02</b>'))  #['<b>测试</b><b>测试01</b><b>测试02</b']
print(re.findall("<b>.*?</b", '<b>测试</b><b>测试01</b><b>测试02</b>')) #['<b>测试</b', '<b>测试01</b', '<b>测试02</b']

finditer()函数

原型:

def finditer(pattern, string, flag=0)

功能

扫描整个字符串string, 并返回所有匹配的pattern模式结果的字符串列表

参数
参数            说明
pattern         匹配成功的正则表达式(一种字符串的模式)
string          要匹配的字符串
flags           标记位, 用于控制正则表达式的匹配方式
特点

多次匹配,匹配任意位置

测试
# 代码
import re #导入re正则模块
obj = re.finditer("<b>.*</b", '<b>测试</b><b>测试01</b><b>测试02</b>')
print(obj)
for i in obj:
    print(i.group())

obj1 = re.finditer("<b>.*?</b", '<b>测试</b><b>测试01</b><b>测试02</b>')
print(obj1)
for i in obj1:
    print(i.group())

# 运行结果
# <callable_iterator object at 0x000001FBC4933F10>
# <b>测试</b><b>测试01</b><b>测试02</b
# <callable_iterator object at 0x000001FBC4933F40>
# <b>测试</b
# <b>测试01</b
# <b>测试02</b

split()函数

原型:

def split(pattern, string, maxsplit=0, flags=0)

功能

切割字符串

参数
pattern         正则表达式
string          要拆分的字符串
maxsplit        最大拆分次数    默认拆分全部
flags           修正符
测试
import re
str = "Hello, I'm zhangsan, nice to meet you!"
print(re.split(",",str))
print(re.split(",",str,maxsplit=1))

# 运行结果
# ['Hello', " I'm zhangsan", ' nice to meet you!']
# ['Hello', " I'm zhangsan, nice to meet you!"]


修正符(flags)
值              说明
re.I            使匹配对大小写不敏感
re.M            多行匹配, 影响到^和$
re.S            使.匹配包括换行符在内的所有字符

分组起名称

概念

处理简单的判断是否匹配之外, 正则表达式还有提取子串的功能, 用()表示的就是要提取的分组

测试
#分组起名称语法     "表达式(?P<别名>表达式)表达式"
import re
print(re.search("(?P<id>\D)", '123w32').group(0))
print(re.search("(?P<id>\D)", '123w32').group('id'))
print(re.search("(?P<number>\d+)", 'hello666').group(0))
print(re.search("(?P<number>\d+)", 'hello666').group('number'))

#运行结果
# w
# w
# 666
# 666

编译

概念

当在python中使用正则表达式时, re模块会做两件事, 一件是编译正则表达式, 如果正则表达式的字符串本身不合法, 会报错。另一件是用编译好的正则表达式提取信息。

编译优点

如果一个正则表达式要使用几千遍, 每一次都会编译, 出于效率的考虑会进行预先编译, 就不需要每次都编译了, 节省了编译的时间, 从而提升效率。

compile()函数
原型

def compile(pattern, flags=0)

功能

将pattern模式编译成正则对象

参数
参数            说明
pattern         匹配的正则表达式(一种字符串的模式)
flags           标识位, 用于控制正则表达式的匹配方式
测试
import re
str = "\d"
reObj = re.compile(str, re.I)
print(reObj)
print(reObj.match("1dfa"))
print(reObj.match("1dfa").group())

#运行结果
# re.compile('\\d', re.IGNORECASE)
# <re.Match object; span=(0, 1), match='1'>
# 1

相关推荐

  1. 表达式

    2024-07-18 14:28:02       58 阅读
  2. 表达式

    2024-07-18 14:28:02       69 阅读
  3. 表达式

    2024-07-18 14:28:02       70 阅读
  4. 【Python】表达式

    2024-07-18 14:28:02       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 14:28:02       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 14:28:02       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 14:28:02       57 阅读
  4. Python语言-面向对象

    2024-07-18 14:28:02       68 阅读

热门阅读

  1. AI发展下的伦理挑战,应当如何应对?

    2024-07-18 14:28:02       18 阅读
  2. SDF学习笔记整理

    2024-07-18 14:28:02       23 阅读
  3. 24/07/18数据结构(7.1220)队列实现

    2024-07-18 14:28:02       21 阅读
  4. HOW - SVG 图标组件封装(Lucide React)

    2024-07-18 14:28:02       22 阅读
  5. Linux-快捷键以及vim工具使用

    2024-07-18 14:28:02       19 阅读
  6. Web前端-Web开发CSS基础3-盒模型

    2024-07-18 14:28:02       19 阅读
  7. C++ bind和placeholders

    2024-07-18 14:28:02       20 阅读
  8. 力扣LCR184.设计自助结算系统

    2024-07-18 14:28:02       19 阅读
  9. SpringBoot 实现整合kafka的简单使用

    2024-07-18 14:28:02       21 阅读
  10. 模乘逆元计算器

    2024-07-18 14:28:02       21 阅读