python-- re 模块

简介: python-- re 模块

字符组,量词,元字符


re 模块,也就是我们常说的正则

正则校验网站:http://tool.chinaz.com/regex/

字符组

在一个字符的位置上能出现的内容

# [1bc]              是一个范围
# [0-9][A-Z][a-z]    匹配三个字符
# [abc0-9]           匹配一个字符
# [0-9a-zA-Z]        匹配一个字符

量词

在量词的后面跟了一个 ? 取消贪婪匹配 非贪婪(惰性)模式

# ?     重复零次或一次     0-1
# +     重复一次或更多次   1-n
# *     重复零次或更多次   0-n
# {n}   重复n次
# {n,}  重复n次或更多次
# {n,m} 重复n到m次

元字符

# \d == [0-9] 也表示匹配一个字符,匹配的是一个数字
# \w == [0-9a-zA-Z_] 也表示匹配一个数字字母下划线
# \s == [\n \t]  包括回车 空格 和 制表符tab
# \n  匹配回车
# \t  匹配制表符
# \D  匹配非数字
# \W  匹配非数字字母下滑线
# \S  匹配非空白
# ^   匹配字符串的开始
# $   匹配字符串的结尾
# a|b 匹配字符a或字符b
# ()  匹配括号内的表达式,也表示一个组
# [^...]匹配除了字符组中字符的所有字符
# .   匹配除换行符以外的任意字符
# [\d\D] [\w\W] [\s\S] 都是匹配所有

特殊用法:在量词的后面跟了一个 ? 取消贪婪匹配 非贪婪(惰性)模式

转义符 \

在正则表达式中,有很多有特殊意义的是元字符,比如\n和\s等,如果要在正则中匹配正常的"\n"而不是"换行符"就需要对"\"进行转义,变成'\\'。

在python中,无论是正则表达式,还是待匹配的内容,都是以字符串的形式出现的,在字符串中\也有特殊的含义,本身还需要转义。所以如果匹配一次"\n",字符串中要写成'\\n',那么正则里就要写成"\\\\n",这样就太麻烦了。这个时候我们就用到了r'\n'这个概念,此时的正则是r'\\n'就可以了。

# |的用法 [1-9]\d{16}[0-9X]|[1-9]\d{14}  身份证号
#  ()的用法 [1-9]\d{14}(\d{2}[1-9X])? 身份证号
# 匹配整数或小数:-?\d+(\.\d+)*


re 模块


# re.match 从头开始匹配
# re.search 匹配包含
# re.findall 把所有匹配到的字符放到以列表中的元素返回
# re.splitall 以匹配到的字符当做列表分隔符
# re.sub      匹配字符并替换
# re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
# M(MULTILINE): 多行模式,改变'^'和'$'的行为(参见上图)
# S(DOTALL): 点任意匹配模式,改变'.'的行为 
# findall 会优先显示分组中的内容,要想取消分组优先,(?:正则表达式)
# plit 遇到分组 会保留分组内被切掉的内容
# search 如果search中有分组的话,通过group(n)就能够拿到group中的匹配的内容
# 分组命名:
# (?P<name>正则表达式) 表示给分组起名字
# (?P=name)表示使用这个分组,这里匹配到的内容应该和分组中的内容完全相同


match


import re
res = re.match('liu', 'liufujia')  # 从头开始匹配
print(res.group())
res = re.match('liu\d+', 'liu352521fujia')  # \d表示匹配一个数字,\d+匹配一个或多个数字
print(res.group())
res = re.match('.', 'liufujia')  # .匹配任意一个字符
print(res.group())
res = re.match('.+', 'liufujia77')  # .匹配任意一个字符,.+匹配所有
print(res.group())

结果:

liu
liu352521
l
liufujia77


search


import re
res = re.search('f[a-z]+a', 'liu321fuJiafujia123')  # .  以f开头,[a-z]小写字母一个,[a-z]+多个小写字母,r[a-z]+a表示以r开头,以a结尾,中间多个任意小写字母
print(res.group())
res = re.search('[a-z]+', 'liuFujia', flags=re.I)  # 忽略大小写
print(res.group())
res = re.search('#.+#', '123#hello#j58')
print(res.group())
res = re.search('aal?', 'aaalexaaa')  # 匹配?前的l一次或0次
print(res.group())
res = re.search('[0-9]{3}', 'as1def2rt3456gh')  # 匹配数字三次
print(res.group())

结果

fujia
liuFujia
#hello#
aa
345

案例二

import re
res = re.search('abc|ABC', 'ABCAabcCD')  # 先匹配左边的abc,第一个满足大写的就返回大写的
print(res.group())
res = re.search('(abc){2}', 'abcccabcabcjid')  # 匹配abc 两次
print(res.group())
res = re.search('\A[0-9]+[a-z]+\Z', '2658afgdfd')  # 匹配数字开头,字母结尾
print(res.group())
res = re.search('\A[0-9]+[a-z]\Z', '2658a')  # 匹配数字开头,一个字母结尾,字母大于一个会报错
print(res.group())
res = re.search('\d+', 'sd5ere65tere862')  # 匹配数字,只匹配一次
print(res.group())
res = re.search('\w+', '$sd5ere65t#ere862')  # 匹配非特殊字符一次
print(res.group())

结果

ABC
abcabc
2658afgdfd
2658a
5
sd5ere65t


findall


import re
res = re.findall('[0-9]{2,3}', 'as1def25rt3456gh')  # 匹配前一个字符n到m次
print(res)
res = re.findall('abc|ABC', 'ABCAabcCD')  # findall满足的都匹配
print(res)
res = re.findall('\d+', 'sd5ere65tere862')
print(res)
res = re.findall('\D+', '$sd5ere65tere862')  # 匹配非数字多次
print(res)
res = re.findall('\w+', '$sd5ere65t#ere862')  # 匹配非特殊字符多次
print(res)

结果:

['25', '345']
['ABC', 'abc']
['5', '65', '862']
['$sd', 'ere', 'tere']
['sd5ere65t', 'ere862']


split 和 sub


import re
res = re.split('[a-z]', '7sdr85fd8gf52')
print(res)
res = re.split('[a-z]+', '7sdr85fd8gf52')
print(res)
res = re.sub('[0-9]+', '|', '2sd36fd5er9')  # 替换,匹配所有的数字,替换为|
print(res)
res = re.sub('[0-9]+', '|', '2sd36fd5er9', count=2)  # 替换,匹配前两次的数字,替换为|
print(res)

结果:

['7', '', '', '85', '', '8', '', '52']
['7', '85', '8', '52']
|sd|fd|er|
|sd|fd5er9


时间效率和空间效率


compile ====》 时间效率

finditer ====》  空间效率

import re
re.findall('-0\.\d+|-[1-9]+(\.\d+)?', 'alex83egon20taibai40')  # --> python解释器能理解的代码 --> 执行代码
ret = re.compile('-0\.\d+|-[1-9]\d+(\.\d+)?')
res = ret.search('alex83egon-20taibai-40')
print(res.group())
# 节省时间 : 只有在多次使用某一个相同的正则表达式的时候,这个compile才会帮助我们提高程序的效率

结果:

-20
import re
print(re.findall('\d', 'sjkhkdy982ufejwsh02yu93jfpwcmc'))
ret = re.finditer('\d', 'sjkhkdy982ufejwsh02yu93jfpwcmc')
for r in ret:
    print(r.group())
ret = re.findall('-0\.\d+|-[1-9]\d*(\.\d+)?', '-1asdada-200')
print(ret)

结果

['9', '8', '2', '0', '2', '9', '3']
9
8
2
0
2
9
3
['', '']


分组


import re
ret = re.findall('www.(baidu|csca).com', 'www.csca.com')
print(ret)

结果:

['csca']

取消分组优先 ?:

import re
ret = re.findall('www.(?:baidu|csca).com', 'www.csca.com')
print(ret)

结果:

['www.csca.com']
import re
ret = re.split('\d+', 'abc83egon20bai40')
print(ret)
ret = re.split('(\d+)', 'abc83egon20bai40')
print(ret)

结果:

['abc', 'egon', 'bai', '']
['abc', '83', 'egon', '20', 'bai', '40', '']

分组遇见 search

import re
ret = re.search('\d+(.\d+)(.\d+)(.\d+)?', '1.2.3.4-2*(60+(-40.35/5)-(-4*3))')
print(ret.group())
print(ret.group(1))
print(ret.group(2))
print(ret.group(3))

结果:

1.2.3.4
.2
.3
.4

相关文章
|
8天前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
18天前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
40 5
|
28天前
|
Java 程序员 开发者
Python的gc模块
Python的gc模块
|
1月前
|
数据采集 Web App开发 JavaScript
python-selenium模块详解!!!
Selenium 是一个强大的自动化测试工具,支持 Python 调用浏览器进行网页抓取。本文介绍了 Selenium 的安装、基本使用、元素定位、高级操作等内容。主要内容包括:发送请求、加载网页、元素定位、处理 Cookie、无头浏览器设置、页面等待、窗口和 iframe 切换等。通过示例代码帮助读者快速掌握 Selenium 的核心功能。
95 5
|
2月前
|
Python
SciPy 教程 之 SciPy 模块列表 6
SciPy教程之常量模块介绍:涵盖公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率及力学单位。示例展示了角度单位转换为弧度的几个常用常量。
20 7
|
2月前
|
Python
SciPy 教程 之 SciPy 模块列表 7
`scipy.constants` 模块提供了常用的时间单位转换为秒数的功能。例如,`constants.hour` 返回 3600.0 秒,表示一小时的秒数。其他常用时间单位包括分钟、天、周、年和儒略年。
19 6
|
1月前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy教程之SciPy模块列表13:单位类型。常量模块包含多种单位,如公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了如何使用`constants`模块获取零摄氏度对应的开尔文值(273.15)和华氏度与摄氏度的转换系数(0.5556)。
18 1
|
1月前
|
XML 前端开发 数据格式
超级详细的python中bs4模块详解
Beautiful Soup 是一个用于从网页中抓取数据的 Python 库,提供了简单易用的函数来处理导航、搜索和修改分析树。支持多种解析器,如 Python 标准库中的 HTML 解析器和更强大的 lxml 解析器。通过简单的代码即可实现复杂的数据抓取任务。本文介绍了 Beautiful Soup 的安装、基本使用、对象类型、文档树遍历和搜索方法,以及 CSS 选择器的使用。
88 1
|
2月前
|
Python
SciPy 教程 之 SciPy 模块列表 9
SciPy教程之常量模块介绍,涵盖多种单位类型,如公制、质量、角度、时间、长度、压强等。示例展示了如何使用`scipy.constants`模块查询不同压强单位对应的帕斯卡值,包括atm、bar、torr、mmHg和psi。
16 1
|
2月前
|
Python
SciPy 教程 之 SciPy 模块列表 8
SciPy教程之常量模块单位类型介绍。该模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例展示了部分长度单位的转换值,例如英寸、英尺、海里等。
17 1