正则表达式:文本处理中的瑞士军刀

正则表达式是用于提取字符串规律的规则,通过特定语法表达,以匹配符合该规律的字符串。它具有通用性,不仅适用于Python,也可用于其他编程语言。

下面我用Python的re模块 来进行实战演示:(记得import re

re模块 的主要功能有匹配、搜索、分割、匹配和替换......

re模块 的方法分为两大类:

  1. 直接使用re模块的方法
  2. 使用正则表达式对象

菜鸟营地

findall

python 复制代码
findall(pattern,string[,flags])
# pattern:指定的匹配模式 string:输入的字符串 
# flags:可选参数(用于表示匹配过程中的一些选项)
# 该函数返回值是一个列表

常用pattern

' . ':通配符,代表任意字符(\n除外),一个点一个字符,例如:

python 复制代码
ret = re.findall('m...e', 'cat and mouse') 
print(ret)#['mouse']

' * ':重复,运行*之前的一个字符重复多次,例如:

python 复制代码
ret1 = re.findall('o*i', 'oooooi and bye')
print(ret1)#['oooooi']

' ? ':也是重复匹配,允许?之前的字符只能重复0次或者1次,例如:

python 复制代码
ret2 = re.findall('ca?t', 'ct cat caat caaat')
print(ret2)#['ct', 'cat']

' + ':也是重复匹配,但是至少重复1次,不能是0次,例如:

python 复制代码
ret2 = re.findall('ca+t', 'ct cat caat caaat')
print(ret2)#['cat', 'caat', 'caaat']

' {} ':也是重复匹配,但是匹配次数可以自行设置,次数可以是一个数或者范围,例如:

|-------|---------------|
| {m} | 匹配前一个字符出现m次 |
| {m,} | 匹配前一个字符至少出现m次 |
| {m,n} | 匹配前一个字符出现m-n次 |

python 复制代码
ret3 = re.findall('ca{2}t', 'ct cat caat caaat caaaat')
print(ret3)#['caat']
ret3 = re.findall('ca{2,}t', 'ct cat caat caaat caaaat')
print(ret3)#['caat', 'caaat', 'caaaat']
ret3 = re.findall('ca{2,3}t', 'ct cat caat caaat caaaat')
print(ret3)#['caat', 'caaat']

' ^ ':必须从字符串的起始位置开始匹配,例如:

python 复制代码
ret5 = re.findall('^m...e', 'cat and mouse')
print(ret5)#[]
ret6 = re.findall('^m...e', 'mouse and cat')
print(ret6)#['mouse']

' $ ':值从最后开始匹配,例如:

python 复制代码
ret7 = re.findall('m...e$', 'cat and mouse')
print(ret7)#['mouse']

' | ':两个模式进行或的匹配,例如:

python 复制代码
ret8 = re.findall('cat|mouse', 'cat and mouse')
print(ret8)#['cat', 'mouse']

' \ ':转义字符,例如:

python 复制代码
ret9 = re.findall('/^m...e', '^mouse and cat')
print(ret9)#[]

|--------|--------------------|
| 字符 | 功能 |
| \d | 匹配数字,即0-9 |
| \D | 匹配非数字 |
| \s | 匹配空白,即空格,tab键 |
| \S | 匹配非空白 |
| \w | 匹配单词、字符 |
| \W | 匹配非单词字符 |
| [ ] | 匹配[ ]中列举的字符的其中一个 |

python 复制代码
ret = re.findall('12[qaz]','13qwe12qwe')
print(ret)#['12q']

**\^**789\]:不匹配789中的一个,\^是非的意思 ```python ret = re.findall('12[^qaz]','13qwe12pqwe') print(ret)#['12p'] ``` |-----|--------------------------| | \\b | 匹配一个单词的边界(字母数字和非字母数字的边界) | | \\B | 匹配非单词的边界 | ```python ret = re.findall('oi\\b','oi.55llhihibye') print(ret)#['oi'] ``` 即oi的右边不能有字母或数字! ```python ret = re.findall('oi\\B','oi55llhihibye') print(ret)#['oi'] ``` 即oi的右边必须有字母或数字! #### 常用flags * re.IGNORECASE:缩写re.I 表示忽略大小写 ```python ret = re.findall('m...e', 'cat and MOUSE') print(ret)#[] ret = re.findall('m...e', 'cat and mouse',re.IGNORECASE) print(ret)#['mouse'] ``` * re.VERBOSE:缩写re.X 表示忽略模式中的空格,并可以使用#注释代码,提高 可读性 ```python phoneRegex = re.compile(r'''( (\d{3}|\(\d{3}\))? # area code (\s|-|\.)? # separator \d{3} # first 3 digits (\s|-|\.) # separator \d{4} # last 4 digits (\s*(ext|x|ext.)\s*\d{2,5})? # extension )''',re.VERBOSE) ``` 可以按意义,分部分写。一部分写一行,后面加上注释。执行时,注释会被忽略。同时,多余的空白也会被忽略。如果用以前的方式写,则不小心写的空白,可能会改变正则表达式的意义 * re.DOTALL:缩写re.S 表示使元字符也匹配换行符 ```python a = """hhhhoirerej jjjioioeer""" print(re.findall(r'oi.*oi',a))#[] print(re.findall(r'oi.*oi',a,re.S))#['oirerej \njjjioi'] ``` ### match ```python re.match(pattern, string)# pattern 匹配的正则表达式 string 要匹配的字符串 ``` **re.match()必须从字符串开头匹配!**match方法尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。 ```python a = re.match('bbbtest','bbbtestasdtest') print(a) #返回一个匹配对象 print(a.group()) #返回test,获取不到则报错 bbbtest print(a.span()) #返回匹配结果的位置,左闭右开区间 (0, 7) print(re.match('test','atestasdtest')) #返回None None ``` ### search 匹配整个字符串,并返回第一个成功的匹配 ### sub 替换指定的字符串 ```python re.sub(pattern,repl,string) #pattern:要替换的数据 repl:替换成什么 string:源数据 ``` ```python print(re.sub('cnm','hhhh','cnmcnms'))#hhhhhhhhs ``` ### split 对字符串进行分割,并返回一个列表 ```python s = "https:bbbsssd.com" print(re.split("\.",s)) #以.号进行分割['https:bbbsssd', 'com'] print(re.split(":|\.",s)) #以:或者.进行分割['https', 'bbbsssd', 'com'] print(re.split(r",|:|-|%|\.",s)) #找不到的分隔符就忽略['https', 'bbbsssd', 'com'] ``` ### 贪婪 python里的数量词默认是贪婪的,总是尝试尽可能的匹配更多的字符。python中使用?号关闭贪婪模式 ```python print(re.match(r"qq\d+","qq666666")) #会尽可能多的去匹配\d print(re.match(r"qq\d+?","qq66666777")) #尽可能少的去匹配\d ``` ## 华山论剑 ### 提取图片地址 ```python import re a='' re = re.search("src=\"https.*\"",a) print(re.group())#src="https://act-webstatic.mihoyo.com/hk4e/e20200928calculate/item_icon_u8f88e/32ea78b3df5ba600611c015475e648a4.png?x-oss-process=image%2Fresize%2Cw_104%2Fquality%2CQ_90%2Fformat%2Cwebp" class="recommend-popup__item-img" #因为python是贪婪的 a='' re = re.search(r'src="https\S+"', a) if re: print(re.group())#src="https://act-webstatic.mihoyo.com/hk4e/e20200928calculate/item_icon_u8f88e/32ea78b3df5ba600611c015475e648a4.png?x-oss-process=image%2Fresize%2Cw_104%2Fquality%2CQ_90%2Fformat%2Cwebp" ```

相关推荐
费弗里10 分钟前
Python全栈应用开发利器Dash 3.x新版本介绍(2)
python·dash
吴佳浩28 分钟前
Python入门指南-AI番外-MCP完整教程:从零开始学会Model Context Protocol
人工智能·python·mcp
加油吧zkf40 分钟前
目标检测新纪元:DETR到Mamba实战解析
图像处理·人工智能·python·目标检测·分类
程序员阿超的博客1 小时前
Python 数据分析与机器学习入门 (五):Matplotlib 数据可视化基础
python·信息可视化·数据分析·matplotlib·数据可视化·python教程·pyplot
人生在勤,不索何获-白大侠1 小时前
day15——Java常用API(二):常见算法、正则表达式与异常处理详解
java·算法·正则表达式
站大爷IP1 小时前
Python 办公实战:用 python-docx 自动生成 Word 文档
python
MO2T2 小时前
使用 Flask 构建基于 Dify 的企业资金投向与客户分类评估系统
后端·python·语言模型·flask
慢热型网友.2 小时前
用 Docker 构建你的第一个 Python Flask 程序
python·docker·flask
Naiva2 小时前
【小技巧】Python + PyCharm 小智AI配置MCP接入点使用说明(内测)( PyInstaller打包成 .exe 可执行文件)
开发语言·python·pycharm
云动雨颤2 小时前
Python 自动化办公神器|一键转换所有文档为 PDF
运维·python