正则表达式
首先正则表达式和python没有任何的关系,是匹配字符串的一种规则
官方定义:
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

正则,就只和字符串相关了.
字符组: [字符组]
在同一个位置可能出现的各种字符组成的一个字符组,在正则表达式中用[]表示.
[]表示的是一个范围,里面相当于要匹配的数据集.
正则 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
[0123456789] | 8 | True | 8在字符集中,所以可以匹配到 |
[0-9] | 7 | True | 可以用-表示范围 |
[a-z] | s | True | 可以匹配所有的小写字母 |
[0-9a-zA-Z] | a | True | 可以匹配字母和数字 |
特殊意义的元字符
元字符 | 匹配内容 | |
. | 匹配除换行符以外的任意字符 | |
\w | 匹配字母或数字或下划线 | |
\s | 匹配任意的空白字符 | |
\d | 匹配数字 | |
\n | 匹配一个换行符 | |
\t | 匹配一个制表符 | |
\b | 匹配一个单词的结尾 | |
^ | 匹配字符串的开始 | |
$ | 匹配字符串的结尾 | |
\W | 匹配非字母或数字或下划线 | |
\D | 匹配非数字 | |
\S | 匹配非空白符 | |
a | b | 匹配字符a或字符b |
() | 匹配括号内的表达式,也表示一个组 | |
[...] | 匹配字符组中的字符 | |
[^...] | 匹配除了字符组中的字符的所有字符 |
量词:
量词 | 用法 |
---|---|
* | 重复0此或多次 |
+ | 重复一次或多次 |
? | 重复0次或1次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{m,n} | 重复m到n次 |
. ^ $
正则 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
海. | 海燕海角海东 | 海燕海角海东 | 匹配所有的"海." 的字符 |
^海. | 海燕海角海东 | 海燕 | 只匹配字符串开头的海字开头的 |
海.$ | 海燕海娇海东 | 海东 | 只匹配结尾的"海.$" |





几个常用的非贪婪匹配Pattern
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
.*?的用法
. 是任意字符
* 是取 0 至 无限长度
? 是非贪婪模式。
何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:
.*?x
就是取前面任意长度的字符,直到一个x出现
findall match search的区别?
- findall
在string中进行搜索查找所有的匹配成功的组,即用括号括起来的部分.返回list对象,每个list item是由每个匹配的所有组组成的list
- search
在string中全局进行搜索,成功返回Match object.可以通过group得到结果,失败返回None
- match
匹配string的开头,成功返回Match object.可以通过group得到结果,失败返回None.
# encoding:utf-8
__author__ = 'Fioman'
__date__ = '2018/11/20 14:17'
import re
# findall 返回一个所有的满足匹配条件的一个列表
# search
# match
# 返回所有满足匹配条件的内容,放到列表中
ret = re.findall('[a-z]+', 'eva egon yuan')
print(ret)
# 从前往后,找到一个就返回,返回的是一个对象,需要调用group()才能找到结果
# 如果找不返回None,这个时候调用group会报错.这种情况下,最好用if判断一哈
# 再group
ret1 = re.search('a', 'eva egon yuan')
if ret1:
print(ret1.group())
# match和search的用法一样.但是match是从头开始匹配,如果正则规则从头开始可以
# 匹配上,就返回一个变量.匹配的内容需要用gorup才能显示.如果没有匹配上,就返回None
# 调用group会报错.match表示的是从字符串起始处就要匹配上才可以.
print('*' * 20)
ret2 = re.match('eg', 'eva egon yuan')
print(ret2)
if ret2:
print(ret2.group())
- split
ret = re.split('[ab]', 'abcd')
# 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
print(ret) # ['', '', 'cd']
- sub
ret = re.sub('\d', 'H', 'eva3egon4yuan4',1)
# 将数字替换成'H',参数1表示只替换1个
print(ret) #evaHegon4yuan4
- compile
obj = re.compile('\d{3}')
#将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group())
ret = obj.search('abcashgjgsdghkash456eeee3wr2') #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group()) #结果 : 123
import re
ret = re.finditer('\d', 'ds3sy4784a') #finditer返回一个存放匹配结果的迭代器
print(ret) # <callable_iterator object at 0x10195f940>
# print(next(ret).group()) #查看第一个结果
# print(next(ret).group()) #查看第二个结果
# print([i.group() for i in ret]) #查看剩余的左右结果
for i in ret:
print(i.group())
网友评论