文章目录
一,正则表达式
什么是正则表达式:正则表达式又称规则表达式。用来匹配,检索,替换符合某个规则的文本。表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符,及这些特定字符的组合,组成一个”规则字符串“,这个”规则字符串“用来表达对字符串的一种过滤逻辑。
1.1元字符
1.1.1元字符(1)
. 匹配单个字符,如 r.t匹配 rat,rot 等
* 匹配任意多个字符
+ 匹配一个或多个在它之前的那个字符,如:r+t 匹配 rt ,rrt 等
\ 转意字符将元字符当作普通字符
1.1.1元字符(2)
? 只能匹配0或1个在他之前的字符,如: r?t ,只匹配 t 或者 rt
| 两个匹配条件进行逻辑‘’或‘’运算,如: \(him\|her\) 匹配 him 或者 her
$ 匹配行结束符,如: boy$ 匹配以boy位行结尾的字符串
^ 匹配一行的开始,如: ^boy 匹配以boy为行首的字符串
1.1.1元字符(3)
[ ] 匹配括号中的任意一个字符,如:r[aou]t 匹配 rot, rat, rut
[c1-c2] 括号中可以使用连字符-来指定,如:[0-5],匹配 0 1 2 3 4 5
[^c1-c2] 匹配除了指定区间外的补集,如:[^257a-c]匹配除了2 5 7 a b c以外的任何一个字符
1.1.1元字符(4)
\< 和 \> 匹配词(word)的开始和结束,如:\<the 匹配 them 不匹配 other,如:the\>匹配 them 不匹配 other
\( \) 将两个之间的表达式定义为一个‘“组”,并且将这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到 \9的符号来引用。如:%s/\(99\)/\1aa/g 将99替换成99aa
1.1.1元字符(5)
\{ i \} 和 \{i , j \} 匹配指定数目的字符,如:a[1-6]\{2\}能够匹配到a后面跟着的正好2个字符的a13, a24, a54等不会匹配到 a123
二,python中使用正则表达式
python通过使用re模块,获得全部正则表达式的功能
2.1re.match
对字符串进行完整的匹配(从0开始匹配)
re.match(pattern, string, flags=0)
pattern: 匹配的正则表达式
string: 要匹配的字符串
flags: 标志位,用于 控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
示例1:
import re
print(re.match('www','www2 213 sad')) #在起始位置匹配
print(re.match('www','2 213 swwwad')) #不在起始位置匹配
#执行结果
<_sre.SRE_Match object; span=(0, 3), match='www'>
None
示例2:
. 代表任意一个字符
* 是前面一个字符的任意重复
re.I 表示忽略大小写
r 表示原始字符串(不用转义)
print("\ne")
print(r"\ne")
#执行结果
e
\ne
直接输出matchobj.group()会输出匹配到的整句话,matchobj.group(1)会输出匹配到的第一组
matchobj.group(2)会输出匹配到的第一组。
import re
line = "Page is a pig"
matchobj = re.match(r'(.*) is a (.*)',line,re.I)
print(matchobj.group())
print(matchobj.group(1))
print(matchobj.group(2))
#执行结果
Page is a pig
Page
pig
2.2re.search
扫描整个字符串并返回第一个成功的匹配
re.search(pattern, string, flags=0)
pattern: 匹配的正则表达式
string: 要匹配的字符串
flags: 标志位,用于 控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
示例:
import re
print(re.search('www','2 213 swwwad'))
print(re.search('www','2 213 swwwad').group()) #匹配不上返回空
#执行结果
<_sre.SRE_Match object; span=(7, 10), match='www'>
www
2.3re.sub
用于替换字符串中的匹配项
re.sub(pattern , repl , string , count=0, flags=0)
pattern: 匹配的正则表达式
repl: 替换的字符串,也可以为一个函数
string: 要被查找替换的字符串
count: 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配
flags: 标志位,用于 控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
示例1:传入的是一个字符串
#.*$ 的意思是以#开头任意字符结尾
\D 的意思是非数字的字符串
import re
phone = "0086-10-12345678 #这是一个国内北京的电话号码"
#删除后面的注释
num = re.sub(r'#.*$',"",phone)
print(num)
#删除非数字的字符串
num = re.sub(r'\D',"",phone)
print(num)
#执行结果
0086-10-12345678
00861012345678
示例2:传入的是一个函数
(?P<value>…):这部分是正则表达式中的命名捕获组语法。它允许给一个子模式(…)指定一个名称,这里的名称是’value’。通过这个名称,可以在匹配结果中引用到这个具体的子模式。
\d+:这是一个子模式,用于匹配一个或多个数字字符。\d表示匹配任意一个数字字符(0-9),而+表示匹配前面的模式一次或多次。
import re
def double(matched):
value = int(matched.group('value'))
return str(value*2)
s = '321+123=444'
print(re.sub('(?P<value>\d+)',double,s))
#执行结果
642+246=888
2.4 正则表达式修饰符
1,re.I : 忽略大小写匹配
2.,re.M : 多行匹配。使 ^ 和 $ 可以匹配每一行的开头和结尾,而不仅仅是整个字符串的开头和结尾。
3.re.S : 单行匹配。使 . 可以匹配包括换行符在内的任意字符
4,re.X: 冗长模式。允许使用空白字符和注释来增加正则表达式的可读性。