Python正则表达式(常用)

发布时间:2024年01月16日

本文讲解一下Python的正则表达式,主要介绍正则表达式的概、在Python中如何使用正则表达式,常用的正则表达式处理函数,最后分享几个简单的使用示例。

一、正则表达式

1、概念

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑。

2、用途

  • 匹配和查找文本:使用正则表达式可以快速匹配和查找特定模式的文本,例如查找包含特定单词的句子、匹配邮箱、电话等;
  • 数据清洗和处理:去除特定字符或标签、提取文本中的有效信息等;
  • 表单验证:正则表达式可以用于验证用户输入的表单数据,验证邮箱地址是否合法等;
  • 字符串替换:将文本中的某个模式替换为另一个字符串;
  • 提取信息:提取特定的信息,例如提取网页中的链接,日志中的关键信息。

3、在线测试工具

链接:正则表达式

二、Python正则表达式

Python内置了re模块,封装了一些函数用来处理正则表达式。 简单示例:

import re

raw_str = 'abc12def'
result = re.search('\d+', raw_str)
print(result.group())  # 12

三、re模块常用函数

1、re.match

尝试从字符串的起始位置匹配一个模式,如果不是起始位置,match返回None。 re.match(pattern, string, flags=0)

参数描述
pattern匹配的正则表达式
string要匹配的字符串
flags标志位,用于控制正则表达式的匹配方式,比如:是否区分大小写,多行匹配等
  • re.I 使匹配对大小写不敏感
  • re.L 做本地化识别匹配
  • re.M 多行匹配
  • re.S 使.匹配包括换行在内的所有字符
  • re.U 根据Unicode字符集解析字符
  • re.X 为了增加可读性,忽略空格和#后面的注释

2、re.search

扫描整个字符串并返回第一个成功的匹配。

search vs match

match要从字符串的起始位置匹配。

import re

raw_str = 'abc12def'
result1 = re.search('\d+', raw_str)
result2 = re.match('\d+', raw_str)
print(result1.group())  # 12
print(result2.group())  # None

3、re.sub

用于替换字符串中的匹配项。 re.sub(pattern, repl, string, count, flags)

参数描述
pattern匹配的正则表达式
repl替换的字符串,也可以是一个函数
string要匹配的字符串
count模式陪陪后替换的最大次数,默认替换所有
flags标志位,用于控制正则表达式的匹配方式,比如:是否区分大小写,多行匹配等

简单替换:

import re

phone = "2024-959-459"

# 删除非数字'-'
num = re.sub(r'\D', phone)
print(num) # 2024959459

函数模式替换:

import re

# 将匹配的数字乘以2
def double(matched):
    value = int(matched.group('value'))
    return str(value * 2)

raw_str = 'A12B3C'
print(re.sub('(?P<value>\d+)',double, raw_str)) # A24B6C

4、re.compile

compile函数用于编译正则表达式,生成一个正则表达式Pattern对象,供match和search使用。 re.compile(pattern[, flags])

import re
pattern = re.compile(r'\d+')                    # 用于匹配至少一个数字
m = pattern.match('12twothree34four')        # 查找头部,没有匹配
print(m.group(0)) # 12

5、re.findall

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表。 findall(pattern, string, flags=0)

import re

pattern = re.compile(r'\d+')   # 查找数字
result = pattern.findall('abc 123 def 456')
print(result) # [123,456]

如果匹配不到返回空列表。

6、re.finditer

在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。 re.finditer(pattern, string, flags=0)

import re

it = re.finditer(r"\d+","12a32bc43jf3") 
for match in it: 
    print (match.group())

12 32 43 3

7、re.split

按照能够匹配的子串将字符串分割后返回列表。

re.split(pattern, string[, maxsplit=0, flags=0])

maxsplit 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。

import re

print(re.split('\W+', 'hello,world,')) # ['hello','world','']
import re

re.split('b*', 'hello world') 
['hello world']

找不到匹配的字符串,split 不会分割。

8、分组

正则表达式中,group()用来提出分组截获的字符串。

import re
a = "123abc456"

print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0))  # 123abc456,返回整体
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1))  # 123
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2))   # abc
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3))  # 456

正则表达式中的三组括号把匹配结果分成三组 group() 同group(0)就是匹配正则表达式整体结果 group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。

9、贪婪模式与非贪婪模式

import re

text = "0123456"

# 贪婪模式
result1 = re.match('\d+',text)
# 非贪婪模式
result2 = re.match('\d+?',text)
print(result1.group()) # 0123456
print(result2.group()) # 0

四、正则表达式模式

参数描述
^匹配字符串的开头
$匹配字符串的末尾
.匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[…]用来表示一组字符,单独列出:[amk] 匹配 ‘a’,‘m’或’k’
[^…]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re*匹配0个或多个的表达式。
re+匹配1个或多个的表达式。
re?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{n}精确匹配n个前面表达式。例如,o{2}不能匹配"Bob"中的"o",但是能匹配"food"中的两个o。
re{n,}匹配n个前面表达式。例如,o{2,}不能匹配"Bob"中的"o",但能匹配
re{n,m}匹配n到m次由前面的正则表达式定义的片段,贪婪方式
a|b匹配a或b
(re)对正则表达式分组并记住匹配的文本
(?imx)正则表达式包含三种可选标志:i,m,或x。只影响括号中的区域。
(?-imx)正则表达式关闭 i,m,或x可选标志。只影响括号中的区域。
(?:re)类似 (…),但是不表示一个组
(?imx:re)在括号中使用i,m,或x可选标志
(?-imx:re)在括号中不使用i,m,或x可选标志
(?#…)注释.
(?=re)前向肯定界定符。如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?!re)前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?>re)匹配的独立模式,省去回溯。
\w匹配字母数字及下划线
\W匹配非字母数字及下划线
\s匹配任意空白字符,等价于 []。
\S匹配任意非空字符
\d匹配任意数字,等价于 [0-9].
\D匹配任意非数字
\A匹配字符串开始
\Z匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
\z匹配字符串结束
\G匹配最后匹配完成的位置。
\b匹配一个单词边界,也就是指单词和空格间的位置。例如,‘e’可以匹配"never"中的’er’,但不能匹配"verb"中的 ‘er’。
\B匹配非单词边界。‘er\B’ 能匹配"verb"中的 ‘er’,但不能匹配"never"中的’er’。
\n,\t,等.匹配一个换行符。匹配一个制表符。
\1…\9匹配第n个分组的内容。
\10匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。

五、常用示例

1、匹配"Python"或"python"

[Pp]ython

2、匹配括号内的任意字母

[aeiou]

3、匹配任意字母或数字

[a-zA-Z0-9]

4、匹配除了数字外的字符

[^0-9]\D

5、匹配邮箱

[\w\.-]+@\.\w+

6、findall多个匹配模式,返回元组列表

import re

result = re.findall(r'(\w+)=(\d+)','width=20,height=10')
print(result) # [('width','20'),('height','10')]

7、返回字典对象

import re

raw_str = '132929199703271118'

result = re.search('(?P<province>\d{3})(?P<city>\d{3})(?P<birthday>\d{8})', raw_str)

print(result.groupdict())

{‘province’: ‘132’, ‘city’: ‘929’, ‘birthday’: ‘19970327’}

如果您觉得对你有帮助,请不要吝啬你的爱心,如果有更多正则表达式技巧,也欢迎分享!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以上就是“Python正则表达式(常用)”的全部内容,希望对你有所帮助。
?
?关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

二、Python必备开发工具

img

三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

五、Python练习题

检查学习结果。

img

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

img

最后祝大家天天进步!!

上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。

文章来源:https://blog.csdn.net/m0_59236127/article/details/135594782
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。