什么是正则表达式?
正则表达式是一组由普通字符和元字符组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。一个正则表达式是一种从左到右匹配主体字符串的模式,常使用缩写的术语“regex”或“regexp”。
目录
目录
前言
在实际开发过程中经常会有查找符合某些复杂规则的字符串的 需要,比如:邮箱、图片地址,手机号码等,这时候想匹配或者 查找符合某些规则的字符串就可以使用正则表达式了。
在观看文章时可以打开这一个正则测试工具的网站正则表达式在线测试 | 菜鸟工具 (jyshare.com),这样更有利于记忆。
正文
1、正则表达式优缺点
缺点:正则表达式的语法很令人头疼,可读性差
优点:正则表达式通用强,能够适用于很多编程语言
2、元字符
在开头介绍到,正则表达式是由普通字符和元字符构成,在使用正则时普通字符可直接使用,效果类似于查找。但是元字符不同,每一个元字符都有不同的特殊意义,以下是一些元字符的介绍:
元字符 | 描述 |
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线 |
\s | 匹配任意的空白符,包括换行符、制表符 |
\d | 匹配任意数字 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾 |
\W | 匹配非字母或数字或下划线 |
\D | 匹配非数字 |
\S | 匹配非空白字符 |
a|b | 匹配字符a或者字符b |
() | 匹配括号内的表达式,也表示一个组 |
[...] | 匹配字符组中的字符 |
[^...] | 匹配除了字符组中字符其他所有字符都匹配 |
3、量词
上述的元字符中,每一个元字符一次,只能匹配一个满足其特殊意义的字符,但是在日常编写代码的过程中,我们通常希望,一次能匹配多个字符1(如匹配电话号码,一次需要是匹配是十一个字符),这时为了代码的简洁性,量词也就诞生了。
量词主要用于控制元字符出现的次数,需要注意每一个量词只对其前一个元字符或普通字符生效,一下是量词的介绍:
量词 | 描述 |
* | 重复0次或者更多次 |
+ | 重复1次或更多次 |
? | 重复0次或者1次 |
{n} | 匹配n次 |
{n,} | 重复匹配n次或更多次 |
{n,m} | 重复匹配n到m次 |
4、在python中使用正则表达式
1、导入正则库
正则库是python中的内置库,直接使用inport导入即可
import re
2、 常用的正则库函数介绍
在正则库中我们常见的有三个函数分别为:findall、search、match
1、findall()
作用:从头到尾进行匹配,并且以列表的形式返回整个字符串满足正则表达式的数据
语法:findall(正则表达式,匹配的字符串)
找到返回所有数据组成的列表,没有找到返回一个空列表
2、search()
作用:全文匹配,只返回第一个匹配成功的对象
语法:search(正则表达式,匹配的字符串)
返回match对象,获取数据需要使用group提取
3、 match
作用:从头部匹配,如果匹配的数据在中间匹配不到返回None
语法:match(正则表达式,匹配的字符串)
返回match对象,获取数据需要使用group提取
三者语法基本一直,但是意义同,返回值也略有不同,需要注意一下
4、complie 正则预设函数
作用:将正则表达式字符串编译成一个正则表达式对象,这样可以提高匹配效率。
语法:变量名.函数(srt) 函数为上面的三个函数
import re
str1 = 'abc123efd123'
pattern = re.compile(r'\d+')
print(pattern.findall(str1))
print(pattern.search(str1))
print(pattern.match(str1))
# 格式二
print(re.findall(pattern, str1))
3、匹配单个字符
# 3.1、 . 匹配除换行符以外的任意字符
str1 = 'hello world 123\n\t'
print(re.findall(r'.', str1))
# 3.2、\w 匹配数字、字母、下划线
print(re.findall(r'\w', str1))
# 3.3、\W 匹配非数字、字母、下划线
print(re.findall(r'\W', str1))
# 3.4、\d 匹配数字
print(re.findall(r'\d', str1))
# 3.5、\D 匹配非数字
print(re.findall(r'\D', str1))
# 3.6、 \s 匹配空白符,也包括换行符
print(re.findall(r'\s', str1))
# 3.7、 \S 匹配非空白符
print(re.findall(r'\S', str1))
# 3.8、 \n 匹配换行符
print(re.findall(r'\n', str1))
# 3.8、 \t 匹配制表符
print(re.findall(r'\t', str1))
# 3.9、[] 匹配符合中括号中的字符
print(re.findall('[a-z]', str1))
"""
[0-9] 匹配数字0-9
[A-Z] 匹配字母A-Z
[a-z] 匹配字母a-z
[0-9A-Za-z]
"""
# 3.10、[^] 取反,不匹配中括号中的字符
print(re.findall('[^a-z]', str1))
# 3.11、a|b 匹配字符a或者字符b
print(re.findall('a|o', 'hello world'))
# 3.12、() 把符合括号里的表达式单独匹配出来,分组的操作
print(re.findall(r'ab*', 'abbbaabbaa'))
print(re.findall(r'a(b*)', 'abbbaabbaa'))
s = '书名:斗罗大陆\n作者:唐家三少'
print(re.findall(':(.*)', s))
print(re.findall(':.*', s))
4、匹配多个字符
注意:量词都只作用于前一个字符
# 4.1、* :前一个字符重复0次或任意次
print(re.findall('ab*', 'abababbabbaabb'))
# 4.2、 + :前一个字符最少出现一次或任意次
print(re.findall('ab+', 'abababbabbaabb'))
# 4.3、 ? :前一个字符最少出现0次,最多1次
print(re.findall('ab?', 'abababbabbaabb'))
# 4.4、{n} :前一个字符匹配n次
print(re.findall(r'ab{1}', 'ababbbbabbbbabbaabbbb'))
# 4.5、{n,} :前一个字符最少匹配n次,最多任意次
print(re.findall(r'ab{1,}', 'ababbbbabbbbabbaabbbb'))
# 4.6、{n,m} :前一个字符最少匹配n次,最多匹配m次,只在范围内,超出的不会匹配到
print(re.findall(r'ab{1,3}', 'ababbbbabbbbabbaabbbb'))
5、匹配开头和结尾
# 5.1、^ 匹配固定字符的开始
print(re.findall('^\w*', 'helloworld'))
# 5.2、$ 匹配固定结尾
li = ['15573524568','18673524564','18674562145']
for i in li:
print(re.findall(r'^1\d{9}[84]$', i))
6、贪婪模式与非贪婪模式
贪婪模式:获取数据的时候有多少拿多少 .* +
非贪婪模式:相反,越少越好,没有都可以。*?
txt = "This is an HTML tag: <head>铁锅炖大大鹅</head>. It means the head of the wholeHTML document."
# 获取<head>
# 贪婪模式
res = re.findall('<.*>',txt)
print(res) # ['<head>铁锅炖大大鹅</head>']
# 非 贪婪模式
res = re.findall('<.*?>',txt)
print(res) #[<head>,</head>]
总结
这玩意还行,挺好用的