今天我们来介绍下正则表达式。
正则表达式在线联系网站
正则表达式(Regular Expression)是一种用于匹配文本模式的工具。它是由普通字符(例如字母、数字)和特殊字符(称为元字符)组成的文本模式描述。通过使用正则表达式,可以快速、灵活地在大量文本中查找、替换符合特定模式的字符串,比如验证用户输入的电子邮件地址、电话号码是否符合格式要求,或者从网页文本中提取特定格式的链接等。
在python中,在正则表达式用re库实现
import re
匹配字符串
-
match()函数
match(参数1,参数2) 参数2(字符串类型数据)中找参数1(正则表达式)的内容
如果参数2起始位置匹配不成功,返回None,如果起始位置匹配成功,返回匹配内容。
pythonimport re str='哇哈哈,康师傅,白象' print(re.match('哇哈哈',str)) print(re.match('白象',str))
-
search()函数
search(参数1,参数2) 参数2(字符串类型数据)中满足参数1(正则表达式)的内容
如果匹配了多个参数1,只返回第一个匹配成功的信息。
pythonimport re str='哇哈哈,康师傅,白象,哇哈哈,小米' print(re.search('哇哈哈',str))
-
findall()函数
findall(参数1,参数2) 参数2(字符串类型数据)中查找满足参数1(正则表达式)的内容
如果匹配了多个参数1,返回匹配成功的全部信息。
特别注意:findall()并不返回匹配的位置,只返回匹配的全部内容。
pythonimport re str='哇哈哈,康师傅,白象,哇哈哈,小米' print(re.findall('哇哈哈',str))
正则表达式
正则表达式是一种使用特殊符号表示字符串的规则。以下将从字符范围、字符出现的次数以及同一类字符3个方向介绍正则表达式
- 字符范围
字符 | 含义 |
---|---|
[xyz] | 字符集合。匹配所包含的任意一个字符。 |
[a-z] | 字符范围。匹配指定范围内的任意字符。 |
python
import re
str='C,C++,Python,Java,C#,Python37'
print(re.search('[y]',str)) #<re.Match object; span=(7, 8), match='y'>
print(re.findall('[0-9]',str)) #['3', '7']
print(re.findall('[n]',str)) #['n', 'n']
print(re.findall('[n][0-9]',str)) #['n3']
- 字符出现的次数
字符 | 含义 |
---|---|
* | 匹配前面的子表达式任意次 |
+ | 匹配前面的子表达式一次或多次 |
? | 匹配前面的子表达式0次或一次 |
^ | 匹配输入行首 |
$ | 匹配输入行尾 |
{n} | 匹配n次,n为非负整数。 |
{n,} | 至少匹配n次,n为非负整数。 |
{n,m} | 最少匹配n次,最多匹配m次。n和m均为非负整数。 |
python
import re
str='fe34h24u56n3h5j6n5j4k23456'
#匹配正则表达式中前面为a~z范围内连续出现任意次的字符,倒数第二个字符是数字,倒数第一个字符是a~z的字母。
print(re.findall('[a-z][0-9]*[a-z]',str)) #['fe', 'h24u', 'n3h', 'j6n', 'j4k']
验证手机号的正确性手机号码以1开头,且一共有11位数字
python
import re
phone_num=input("请输入您的手机号:")
result=re.findall('^1[0-9]{10}$',phone_num)
print(result)
验证QQ号码是否合规QQ号码的位数为5~11位,第一个数字不能为0
python
import re
QQ_number=input("请输入您的QQ号:")
result=re.findall('[1-9][0-9]{4,10}$',QQ_number)
print(result)
- 同一类字符
字符 | 含义 |
---|---|
\d | 匹配一个数字类字符,等价于[0-9] |
\D | 匹配一个非数字类字符,等价于[^0-9] |
\s | 匹配任何不可见字符,等价于[\f\n\r\t\v] |
\S | 匹配任何可见字符,等价于[\f\n\r\t\v] |
\w | 匹配包括下划线任何单词字符,等价于[A-Za-z0-9_] |
\W | 匹配不包括下划线任何单词字符,等价于[^A-Za-z0-9_] |
\b | 匹配一个单词的边界,即单词中与空格邻接的字符 |
\B | 匹配非单词边界 |
\f | 匹配一个分页符 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\t | 匹配一个制表符 |
\v | 匹配一个垂直制表符 |
. | 匹配除\n\r之外的任何单个字符 |
贪婪和非贪婪模
-
贪婪模式
匹配形式是尝试匹配尽可能多的字符。默认匹配模式都是贪婪模式。
-
非贪婪模式
匹配形式是尝试匹配尽可能多的字符。在次数限制操作符后面加上?可以将匹配模式转换为非贪婪模式。
python
import re
str='678gdjde923836oc0dv8899v75676d9v0'
print(re.findall('v\d+',str)) #['v8899', 'v75676', 'v0']
print(re.findall('v\d+?',str)) #['v8', 'v7', 'v0']
或和组
-
或:用|表示,表示将两个匹配条件进行逻辑或(or)运算。
pythonimport re str='flower low lower lowest pow own west' #匹配满足'\w+ow'条件或者满足'we\w+'条件的内容。 #'\w+ow'表示匹配一个或多个单词字符,且后面的字符为ow #'we\w+'表示匹配一个或多个单词字符,且前面的字符为we result=print(re.findall('\w+ow|we\w+',str)) #输出为['flow', 'low', 'low', 'low', 'pow', 'west']
-
组:用(表达式)表示,表示将()中的表达式定义为组,并且将匹配这个表达式的字符保存到一个临时区域,一个正则表达式中最多可以保存9个组。
pythonimport re str='flower low lower lowest power own west' #匹配内容第1个字符是e开始,已知匹配到最后一个字符r,第1组匹配一个或多个除\n\r之外的任何单个字符,默认使用贪婪模式 # 第2组匹配,一个除\n\r之外的任何单个字符 result=print(re.findall('e(.+)(.)r',str)) #输出:[('r low lower lowest pow', 'e')]
sub()和compile()方法
-
sub() 将字符进行替换
sub(参数1,参数2,参数3) 将字符串参数3中所有与参数1匹配的字符串替换为参数2
pythonimport re str='678gdjde923836oc0dv8899v75676d9v0' print(re.sub('\d','0',str)) #输出:00gdjde000000oc0dv0000v00000d0v0
-
compile()将字符串转换为正则表达式
compile()创建一个正则表达式对象,可以直接使用正则表达式对象的方法匹配其他内容。
pythonimport re str1='2024 12 02 12:00' str2=re.compile('\d{2}:\d{2}') print(str2) #re.compile('\\d{2}:\\d{2}') print(str2.findall(str1)) #['12:00']