什么是正则表达式:
正则表达式是一种文本模式,正则表达式使用单个字符串来描述,匹配一系列匹配某个句法规则的字符串。
接下来介绍正则表达式的语法规则,首先介绍正则表达式中的特殊字符:
- $:匹配输入字符串的结尾位置。
- ()标记一个子表达式的开始和结束位置,子表达式可以获取供以后使用。
- *:匹配前面的子表达式零次或者多次。
- +:匹配前面的子表达式一次或者多次。
- ?:匹配前面的子表达式零次或者一次。
- .*:任意匹配除换行符之外的任意单个或多个字符。
- ^:匹配输入字符串的开始位置,除非在方括号表达式中使用。
- |:指明两项之间的一个选择。
- {n}:n是一个非负整数,匹配确定的n次。
- {n,}:n是一个非负整数,至少匹配n次。
- {n,m}:n,m是非负整数且n<=m,最少匹配n次,最多匹配m次。
现在介绍正则表达式中的定位符:
- ^:匹配输入字符串开始的位置。
- $:匹配输入字符串结尾的位置。
- \b:匹配一个单词边界。
- \B:非单词边界匹配。
接下来介绍正则表达式中的元字符:
- [xyz]:字符集合,匹配所包含的任意一个字符。
- [^xyz]:负值字符集合,匹配未包含的任意字符。
- [a-z]:字符范围,匹配指定范围内的任意字符。
- [^a-z]:负值字符范围,匹配任何不在指定范围内的任意字符。
- \d:匹配一个数字字符,等价于[0-9]。
- \D:匹配一个非数字字符,等价于[^0-9]。
- \f:匹配一个换页符。
- \n:匹配一个换行符。
- \r:匹配一个回车符。
- \s:匹配任意空白字符。
- \t:匹配一个制表符。
- \v:匹配一个垂直制表符。
- \w:匹配字母、数字、下划线。
- \W:匹配非字母
- \xn:匹配n,其中n为十六进制转义值。
- \num:匹配num,其中num是一个正整数。
- 正则表达式后面全局标记g指定将该表达式应用到输入字符串中能够查找到的尽可能多的匹配。
正则表达式中的反向引用:
反向引用需要使用到分组,分组就是使用()括起来的部分为一个整体,反向引用即为\1,\2:
- \1:表示的是引用第一次()括起来的部分。
- \2:表示的是引用第二次()括起来的部分。
在匹配分组的时候是由外往里匹配的,其次是由左往右匹配的。具体实例如下:
正则表达式中?=和?:和?!的理解:
- ?::非获取匹配,匹配冒号后面的内容但不获取匹配结果(不将匹配结果存入缓存)。
- ?=和?!:通过实例来了解
out = re.findall(r'\d+(?=abc)',"1abc") ## 只抽取数字,并且该数字后面跟的字符是"abc"
out1 = re.findall(r'\d+(?!abc)',"1abf") ## 只抽取数字,并且该数字后面跟的字符是"abc"
out3 = re.findall("A(?:\d{1,2}月)?D", "啊啊A22月DtttADgggg") ## 目的是抽取以A开头和D结尾的字符串
p
以上,对正则表达式有了基本的了解,接下来学习正则表达式如何在python中进行应用。
正则表达式在python中的应用:
讲到正则表达式,它的应用一定是用来匹配字符串,在python中的re模块拥有正则表达式的所有功能。
re.match函数:
第一个re的函数是re.match:match尝试从字符串的起始位置匹配,如果不是从起始位置匹配成功的话,match就会返回none。
re.match语法:re.match(pattern,string,flags=0)
- pattern:匹配的正则表达式。
- string:要匹配的字符串。
- flags:标志符,用于控制正则表达式的匹配方式。
re.search函数:
re.search函数扫描整个字符串并返回第一个成功的匹配。
re.search语法:re.search(pattern,string,flags=0)。
在这里讲一下group,我们可以使用group(num)或group()匹配对象函数来获取匹配表达式。
import re
line = "Cats are smarter than dogs";
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
if searchObj:
print ("searchObj.group() : ", searchObj.group())
print ("searchObj.group(1) : ", searchObj.group(1))
print ("searchObj.group(2) : ", searchObj.group(2))
else:
print ("Nothing found!!")
# 以上实例执行结果如下
# Cats are smarter than dogs
# Cats
# smarter
re模块提供的替换方法:
re模块提供了re.sub用于替换字符串中的匹配项。
re.sub语法:re.sub(pattern,repl,string,count=0,flags=0)
- pattern:正则中的模式字符串。
- repl:替换的字符串。
- string:要被查找替换的原始字符串。
- count:模式匹配后替换的最大次数。
- falgs:编译时用的匹配模式。
其中值得注意的一点是,repl可以是一个函数,
compile函数:
compile函数用于编译正则表达式,生成一个正则表达式(pattern)对象,供match和search这两个函数使用。
re.compile语法:re.compile(pattern[,flags])
flags为匹配模式,常用的匹配模式有以下几种:
- re.l:忽略大小写
- re.L:表示特殊字符集
- re.M:多行模式
findall函数:
在字符串中找到正则表达式所匹配的所有字串,并且返回一个列表,如果没有匹配的,则返回空列表。
findall语法:findall(string[,pos[,endpos]])
通过下列实例了解:
import re
pattern=re.compile(r'\d+')
result1=pattern,findall('runoob 123 google 456')
result2=pattern.findall('run88oob123google456',0,10)
# 以下为输出结果
# ['123','456']
# ['88','12']
re.finditer函数:
finditer和findall函数类似,在字符串中找到正则表达式所匹配的子串,并把它们作为一个迭代器返回。
re.finditer语法:re.finditer(pattern,string,flags=0)
实例:
import re
it = re,finditer(r'\d+','12a32bd43jf3')
for match in it:
print(match.group)
# 以下为输出结果
# 12
# 32
# 43
# 3
re.split函数:
split方法按照能够匹配的子串将字符串分割后返回列表。
re.split语法:re.split(pattern,string[,maxsplit=0,flags=0]) 其中maxsplit为分割次数。