七、Python-正则表达式

时间:2023-03-10 03:34:46
七、Python-正则表达式
一、正则式表达式语法
正则表达式是一种用来匹配字符串的强有力的武器,设计思想是一种描述性的语言来给字符串定义一个规则,烦死符合规则的字符串,就认为它匹配,否则不匹配
行定位符:用来描述字符串的边界
^:表示行的开始 $:表示行的结尾
eg:^tm #表示要匹配字符串tm的开始位置是行头
tm^ #表示要匹配字符串tm的开始位置是行尾
tm: #表示要匹配字符串tm的开始位置是任意位置
元字符:指在正则表达式中具有特殊意义的专用字符(如:^、$)
. :匹配除换行以外的任意字符 \w:匹配字母或数字或下划线或汉字
\s:匹配任意的空白符 \d:匹配数字
\b:匹配单词的开始或结束 ^:匹配任意字符串的开始
$:匹配字符串的结束
限定符(重复):限制匹配数量
eg:^\d{8}$ #匹配8位数的QQ号
?:匹配前面的字符零次或一次 colou?r #可匹配color或colour
+:匹配前面的字符一次或多次 go+gle #可匹配gogle到goo…gle
*:匹配前面的字符零次或多次 go*gle #可匹配ggle到goo…gle
{n}:匹配前面的字符n次 go{2}gle #可匹配google
{n,}:匹配前面字符最少n次 go{2,}gle #可匹配google到goo…gle
{n,m}:匹配前面字符最少n次最多m次 go{0,2}gle #可匹配ggle、gogle、google
字符类:定义一个字符集合,匹配集合中的字符,使用[]表示(主要针对没有预定义元字符集合)
[0-9] #等同于\d,匹配数字 [a-z0-9A-Z] #(只考虑英文时)等同于\w
[aeiuo] #匹配英文元音字母 [.?!] #匹配标点符号“.”“?”“!”
排除字符:匹配不符合指定字符集合的字符串(用^表示,但在[]中使用)
[^a-zA-Z] #不是字母的集合
选择字符:用来表示匹配一个集合或另一个集合(用|表示)
[a-z]|[0-9] #匹配a-z或0-9的字符
(^\d{15}$)|(^\d{18}$)|(^\d{17})(\d|X|x)$
#表示15位纯数字或18位纯数字或者前17位纯数字最后一位位为X或x
转义字符:使用\表示,把一个特殊字符转义成普通字符,“()”在正则表达式中也算是一个元字符
分组(子表达式):使用()表示
()可以改变限定字符的作用范围
(thir|four)th #表示可以匹配thirth或fourth
()可以分组
(\.[0-9]{1,3}){3} #就是对分组(\.[0-9]{1,3})进行重复三次操作
正则表达式语法:
使用正则表达式时,时将其作为模式字符串使用的(模式字符串中的\等符号需要转义)
'[a-zA-Z]' #匹配不是字母的字符
'\\bm\\w*\\b' #匹配以m开头的单词(其中一个\为转义字符)
模式字符串中含有大量特殊字符串时,可以使用原生字符串表示(在模式字符串前加R或r)
r'\bm\w*\b' #等同于'\\bm\\w*\\b'的效果,匹配以m开头的单词
在编写模式字符串时,并不是所有的反斜杠都需要转换,^\d{8}$就不需要,因为\d没有特殊意义,为了书写方便,一般使用原生字符串表示
二、使用re模块实现正则表达式操作
re模块的compile()方法将模式字符串转换成正则表达式对象,然后再使用该正则表达式对象的相关方法来操作字符串,使用re模块时,需要先用import导入(import re)
匹配字符串:使用re模块提供的match()、search()和findall()方法
    • 使用match()方法匹配:用于从字符串的开始处进行匹配(起始位置匹配成功,则显示match对象,否则显示None)
re.match(pattern,string,[flags])
pattern:表示模式字符串,由要匹配的正则表达式转换而来
string:表示要匹配的字符串
flags:可选参数,表示标志位,用于控制匹配方式(如是否区分大小写)
常用标志位
            • A或ASCII:对于\w、\W、\b、\B、\D、\d、\s、\S只进行ASCII匹配(仅Python3中)
            • I或IGNORECASE:执行不区分字母大小写的匹配
            • M或MULTILINE:将^或$用于包括整个字符串的开始和结尾的每一行(默认仅适用于整个字符串的开始处和结尾处)
            • S或DOTALL:使用“.”字符匹配所有字符,包括换行符
            • X或VERBOSE:忽略模式字符串中未转义的空格和注释
eg:import re
a = r'mr_\w+'
b = 'MR_SHOP mr_shop'
c = re.match(a,b,re.I)
print(c,"\n")
d = '项目名称 MR_SHOP mr_shop'
c = re.match(a,d,re.I)
print(c)
匹配以mr_开头,不区分字母大小写的字符串
    • 使用search()方法匹配:在整个字符串中搜索第一个匹配的值,如起始位置匹配成功,则显示match对象,否则显示None
re.search(pattern,string,[flags])
eg:a = r'mr_\w+'
b = 'MR_SHOP mr_shop'
c = re.search(a,b,re.I)
print(c,"\n")
d = '项目名称 MR_SHOP mr_shop'
c = re.search(a,d,re.I)
print(c)
    • 使用findall()方法匹配:在整个字符串中搜索所有复核正则表达式的字符串,并以列表形式返回,匹配成功者返回包含匹配结构的列表,否则返回空列表
re.findall(pattern,string,[flags])
eg:import re
a = r'mr_\w+
b = 'MR_SHOP mr_shop'
c = re.findall(a,b)
print(c,"\n")
d = '项目名称 MR_SHOP mr_shop'
c = re.findall(a,d,re.I)
print(c)
注:在指定的模式字符串中包含分组时,则返回与分组匹配的文本列表(要想获取整个模式字符串的匹配,可以将整个模式字符串用()进行分组,然后再获取结果时,只取返回值列表的每个元素(返回元组)的第一个元素
eg:import re
a = r'[1-9]{1,3}(\.[0-9]{1,3}){3}'
b = '127.0.0.1 192.168.1.66'
c = re.findall(a,b)
print(c)
eg:import re
a = r'([1-9]{1,3}(\.[0-9]{1,3}){3})'
b = '127.0.0.1 192.168.1.66'
c = re.findall(a,b)
for d in c:
print(d[0])
替换字符串:sub()方法
re.sub(pattern,repl,string,count,flags)
pattern:表示模式字符串
repl:表示替换的字符串
string:表示要被查找替换的原始字符串
count:可选参数,表示模式匹配后替换的最大次数,默认为0,表示替换所有的匹配
flags:可选参数,表示标志位,用于控制匹配方式
eg:import re
a = r'1[34578]\d{9}' #定义11位手机号码的模式字符串
b = '中奖号码为:84978981,联系电话为13611111111'
print(re.sub(a,'1XXXXXXXXXXX',b))
使用正则表达式分割字符串:根据正则表达式分割字符,并以列表形式返回;split()方法
re.split((pattern,string,[maxsplit],[flags]))
pattern:模式字符串,有要匹配的正则表达式转换而来
string:要匹配的字符
maxslip:可选参数,表示最大的拆分次数
flags:可选参数,表示标志位
eg:import re
a = r'[?|&]'
url = 'https://www.baidu.com/s?ie=utf-8&f=8&rsv'
print(re.split(a,url))