python中re库 正则表达式的处理与应用(详细版!!!)
Posted 温柔且上进c
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中re库 正则表达式的处理与应用(详细版!!!)相关的知识,希望对你有一定的参考价值。
正则表达式
•正则表达式(regular expression)描述了一种字符串匹配的模式(pattern)
,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
例如:stud+y,可以匹配study,studdy,studddddddy等,+号代表:加号前一个字符至少出现一次(一次或者多次)
•构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合
python中的re库
re库概念
•re库就是我们常说的正则表达式库,它是用一种形式化语法来描述的文本匹配模式。通过re库,我们可以匹配某些特定字符串中的一些内容,比如爬虫爬取网页内容时,我们可以通过re库获取网页内容中的某些特定标签内容。
查找文本(匹配文本)
•在一串字符串文本中,我们需要查找一个子字符串是否在该字符串中,并返回其具体的位置索引,就可以使用re库
import re
content = 'My name is Yang ChenXi'
pattern = 'name'
match = re.search(pattern, content)
print(match.start())
print(match.end())
运行结果:
3 # 起始索引 (索引从0开始)
7 # 终止索引
总结:
•在这里,我们通过re库中的search()函数查找字符串pattern是否在content字符串中。可以看到,其返回了pattern字符串在content字符串的起始索引与终止索引位置
多重匹配
•当匹配字符串中并不是仅仅只有一个匹配结果,可能会有多个匹配结果出现。我们需要使用re库中的findall()函数来实现多重匹配
import re
content = 'cfccfcfcfcfcffcffcccfcfcf'
pattern = 'cf'
for match in re.findall(pattern, content):
print(match)
运行结果:
cf # 共匹配到10次cf
cf
cf
cf
cf
cf
cf
cf
cf
cf
•上述程序共匹配到10次cf,不过这里是返回的match字符串,并不是和上面一个返回的一个match实例,如果想要获取所有多重匹配结果的索引位置,应使用下述方法
import re
content = 'cfccfcfcfcfcffcffcccfcfcf'
pattern = 'cf'
for match in re.finditer(pattern, content):
print(match.start(), match.end())
运行结果:
0 2 # 第一次匹配到cf的索引位置
3 5
5 7
7 9
9 11
11 13
14 16
19 21
21 23
23 25# 第十次匹配到cf的索引位置
总结:
•re库中的finditer()函数返回的是一个迭代器,它会生成match实例,可以输出多次匹配结果的索引值
元字符(锚定码)
•上述的字符串中里面有多个子字符串,通过匹配肯定会返回多个结果,现在我们有一个新的需求,不管字符串里面有多少个匹配结果,我们只需要第一个匹配结果
•解决方法:这里我们还是可以像上述代码一样先找到所有匹配结果,再取第一个结果就可。但是我们可以通过元字符一步就完成上述目标
•元字符分类:
元字符 | 含义 |
---|---|
. | 表示匹配任意一个字符(除了换行符) |
^ | 表示从字符串开头开始匹配 |
$ | 表示从字符串末尾开始匹配 |
* | 表示匹配某个字符匹配零次或多次 |
+ | 表示匹配某个字符匹配一次或多次 |
? | 表示匹配某个字符匹配零次或一次 |
{} | 表示匹配某个字符匹配任意次 |
[] | 表示为或的意思,匹配 [] 中任一项,里边除了 - \\和^ 不可有其它特殊符号 |
\\A | 字符串开头 |
\\Z | 字符串末尾 |
\\b | 匹配一个单词边界,单词开头或末尾的空串 |
\\B | 匹配非单词边界,不在单词开头或末尾的空串 |
代码测试:
import re
content = 'ycx521ycx125ycx251ycx512ycx521'
print(len(content))
for match in re.finditer('521$', content):
print(match.start(), match.end())
print(re.findall('ycx*', content))
print(re.findall('ycx+', content))
print(re.findall('ycx?', content))
print(re.findall('ycx{5}', content))
print(re.findall('ycx{1,5}', content))
print(re.findall('ycx[12]', content))
运行结果:
30 # 字符串长度
27 30
['ycx', 'ycx', 'ycx', 'ycx', 'ycx']
['ycx', 'ycx', 'ycx', 'ycx', 'ycx']
['ycx', 'ycx', 'ycx', 'ycx', 'ycx']
[]
['ycx', 'ycx', 'ycx', 'ycx', 'ycx']
['ycx1', 'ycx2']
转义码(转义字符)
•除了元字符之外,还可以通过转义码匹配特定的字符,比如上述的元字符只能匹配后面有多少个字符,并不能区分数字或者字母等其他的内容
•转义字符分类:
转义字符 | 含义 |
---|---|
\\d | 匹配数字 |
\\D | 匹配非数字 |
\\s | 匹配空白符(制表符,空格,换行等) |
\\S | 匹配非空白符 |
\\w | 字母数字 |
\\W | 非字母数字 |
代码测试:
import re
content = 'ycx 521'
print(re.findall('\\d', content))
print(re.findall('\\D', content))
print(re.findall('\\s', content))
print(re.findall('\\S', content))
print(re.findall('\\w', content))
print(re.findall('\\W', content))
print(re.findall('\\w*', content))
运行结果:
['5', '2', '1']
['y', 'c', 'x', ' ']
[' ']
['y', 'c', 'x', '5', '2', '1']
['y', 'c', 'x', '5', '2', '1']
[' ']
['ycx', '', '521', '']
fullmatch()
•在某些情况,我们并不是需要在字符串中找到某些规则的子集。而是判断某些字符串是否为特定形式,比如说邮箱,或者是电话等。就需要使用整个字符串与模式匹配,re库提供了fullmatch()函数用于整个模式的匹配
代码测试:
import re
content = "YangChenXi@163.com"
pattern = "^[A-Za-z0-9\\u4e00-\\u9fa5]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$"
s = re.fullmatch(pattern, content)
if s is None:
print('亲,请输入正确的邮箱!!')
else:
print('亲,你好棒棒欧!!')
运行结果:
亲,你好棒棒欧!! # 匹配成功
以上是关于python中re库 正则表达式的处理与应用(详细版!!!)的主要内容,如果未能解决你的问题,请参考以下文章
#yyds干货盘点# Python 内置模块之 re 库,一文搞定正则表达式初阶用法,滚雪球学 Python 第 13 篇