正则表达式
定义:
即高级文本匹配模式,提供了搜索,替代等功能,本质是由一些字符和特殊符号组成的字串。这个字串描述了字符和字符的重复行为,可以匹配某一类特征的字符串集合。
re.findall(regex,string)
功能 : 使用正则表达式匹配字符串
参数 : regex : 正则表达式
string : 目标字符串
返回值 : 匹配到的内容
一 、元字符
(1) 普通字符
匹配规则 : 匹配相应的普通字符
data =re.findall(\'susu\',\'hello, my name is susu\n\') print(data) #输出 [\'susu\']
(2)匹配单一字符 .
匹配规则: 匹配任意一个字符 \'\n\'除外
data =re.findall(\'susg\',\'hello, my name is susu\n\') print(data) #输出 [] data =re.findall(\'s.s\',\'hellomynameissusu\n\') print(data) #输出 [\'sus\'] data =re.findall(\'s..s\',\'hellomynameissusu\n\') print(data) #输出 [\'ssus\'] data =re.findall(\'su\',\'hellomynameissusu\n\') print(data) #输出 [\'su\', \'su\']
(3)匹配字符串开头 ^
data =re.findall(\'^h...o\',\'hellomynameissusu\') #以h 开头 print(data) #输出 [\'hello\']
(4)匹配字符串结尾 $
data =re.findall(\'h...o$\',\'hellomynameissusu\') #以o 结尾 print(data) #输出[] data =re.findall(\'s...o$\',\'hellomynameissusuo\') #以o 结尾 print(data) #输出[\'susuo\']
(5)匹配重复0次或多次 *
data =re.findall(\'d*\',\'hedllodmynddddddameissusud\') #d 重复零次或更多次 print(data) #输出[\'\', \'\', \'d\', \'\', \'\', \'\', \'d\', \'\', \'\', \'\', \'dddddd\', \'\', \'\', \'\', \'\', \'\', \'\', \'\', \'\', \'\', \'d\', \'\'] data =re.findall(\'my*\',\'hedllodmynddddddameissusud\') #y 重复零次或更多次 print(data) #输出 [\'my\', \'m\']
(6)匹配重复1次或多次 +
data =re.findall(\'d+\',\'hedllodmynddddddameissusud\') #d 重复一次或者更多次 print(data) #输出[\'d\', \'d\', \'dddddd\', \'d\']
(7)匹配重复0次或1次 ?
data =re.findall(\'d?\',\'hedllodmynddddddameissusud\') #d 重复零次或者一次 print(data) #输出[\'\', \'\', \'d\', \'\', \'\', \'\', \'d\', \'\', \'\', \'\', \'d\', \'d\', \'d\', \'d\', \'d\', \'d\', \'\', \'\', \'\', \'\', \'\', \'\', \'\', \'\', \'\', \'d\', \'\'] data =re.findall(\'hed?\',\'hedllodmynddddddameissusud\') #d 重复零次或者一次 print(data) #输出[\'hed\'] data =re.findall(\'su?\',\'hedllodmyndudddddameissusud\') #u 重复零次或者一次 print(data) #输出[\'s\', \'su\', \'su\']
(8)匹配重复指定次数{N}
data =re.findall(\'su{1}\',\'hedllodmynduddddsuudameissusud\') #u 重复一次 print(data) #输出[\'su\', \'su\', \'su\'] data =re.findall(\'su{2}\',\'hedllodmynduddddsuudameissusud\') #u 重复两次 print(data) #输出[\'suu\']
(9)匹配重复指定次数范围{N,} {N,M}
data =re.findall(\'su{1,}\',\'hedllodmynduddddsuudameissusud\') #u 重复1次或者更多次 print(data) #输出[\'suu\', \'su\', \'su\'] data =re.findall(\'su{1,}\',\'hedllodmynduddddsuudameissusud\') #u 重复1次或者更多次 print(data) #输出[\'suu\', \'su\', \'su\'] data =re.findall(\'su{2,3}\',\'hedllodmynduddddsuudameissusud\') #u 重复2次或者3次 print(data) #输出[\'suu\']
(10)字符集匹配 [ ]
元字符 : [abcd]
匹配规则 : 匹配中括号中的字符集区间 的一个字符
data=re.findall("www[oldbog baidu]","wwwbaidu") print(data) #输出[\'wwwb\'] data=re.findall("www[baidu]","wwwbaidu") print(data) #输出[\'wwwb\'] data=re.findall("www[baidu]","wwwbaiduwwwaibu") print(data) #输出[\'wwwb\', \'wwwa\'] data=re.findall("www[baidu]","sddwww") print(data) #输出[] data=re.findall("w[a-z]","wu") #a-z 任意字母 print(data) #输出[\'wu\'] data=re.findall("w[a-zA-Z]","wuwO") #a-z 任意字母 A-Z任意字母 print(data) #[\'wu\', \'wO\'] data=re.findall("w[a-z]*","wu") #a-z 任意字母 print(data) #输出[\'wu\'] data=re.findall("w[a-z]*","wue") #a-z 任意字母 print(data) #输出[\'wu\'] data=re.findall("w[a-z]*","wuddddasdwqeqweqwee") #a-z 任意字母 print(data) #输出[\'wuddddasdwqeqweqwee\'] data=re.findall("w[a-z]*","wudd9") #a-z 任意字母 print(data) #输出[\'wudd\'] data=re.findall("w[0-9]*","wudd9") #a-z 任意字母 print(data) #输出[\'w\']
(11)字符集不匹配
元字符 : [^ abc]
匹配规则 : 不匹配出字符集中字符的任意一个字符
data=re.findall("[^abcd]","abcdefghijk") print(data) #输出[\'e\', \'f\', \'g\', \'h\', \'i\', \'j\', \'k\'] data=re.findall("w[^abcd]","wabcdefghijk") print(data) #输出[] data=re.findall("w[^abcd]","wefghijk") print(data) #输出[\'we\']
(12)匹配任意数字(非数字)字符
元字符 : \d [0-9] \D [^0-9]
匹配规则: \d 匹配任意一个数字字符 \D 匹配任意非数字字符
data =re.findall(\'\d+\',\'susu12sugh12haiyun38dddss60\') # 匹配数字 重复一次或者更多次 print(data) #输出[\'12\', \'12\', \'38\', \'60\'] data =re.findall(\'\D+\',\'susu12sugh12haiyun38dddss60\') # 匹配非数字 重复一次或者更多次 print(data) #输出[\'susu\', \'sugh\', \'haiyun\', \'dddss\']
(13)匹配任意普通字符(特殊字符)
元字符 : \w [_0-9a-zA-Z] \W [^_0-9a-zA-Z]
匹配规则 : \w 匹配数字字母下划线 \W 除了数字字母下划线
data =re.findall(\'\w+\',\'susu12###~su_gh12###@@!haiyun38###%^&*dddss60()()苏苏88\') #匹配字母或者数字或者下划线或者汉字 重复一次或者更多次 print(data) #输出[\'susu12\', \'su_gh12\', \'haiyun38\', \'dddss60\', \'苏苏88\'] data =re.findall(\'\W+\',\'susu12###~su_gh12###@@!haiyun38###%^&*dddss60()()苏苏88\') #匹配非字母或者数字或者下划线或者汉字 重复一次或者更多次 print(data) #输出[\'###~\', \'###@@!\', \'###%^&*\', \'()()\']
(14)匹配任意 (非)空字符
元字符 : \s \S
匹配规则: \s 任意空字符 [ \n\0\t\r] 空格 换行 回车 制表
\S 任意非空字符
data =re.findall(\'\s+\',\'susu12 sugh12 haiyun38 dddss60\') # 匹配任意的空白符 重复一次或者更多次 print(data) #输出[\' \', \' \', \' \'] data =re.findall(\'\S+\',\'susu12 sugh12 haiyun38 dddss60\') # 匹配任意的非空白符 重复一次或者更多次 print(data) #输出[\'susu12\', \'sugh12\', \'haiyun38\', \'dddss60\']
(15)匹配字符串开头结尾
元字符 : \A ^ \Z $
匹配规则: \A 表示匹配字符串开头位置
\Z 表示匹配字符串的结尾位置
data =re.findall(\'\Ahai\',\'susu12 sugh12 haiyun38 dddss60\') print(data) #输出[] data =re.findall(\'\As\',\'susu12 sugh12 haiyun38 dddss60\') print(data) #输出[\'s\'] data =re.findall(\'60\Z\',\'susu12 sugh12 haiyun38 dddss60\') print(data) #输出[\'60\'] data =re.findall(\'\Ahello\Z\',\'hello\') print(data) #输出[\'hello\'] data =re.findall(\'\Ahello\Z\',\'helElo\') print(data) #输出[]
(16)使用 或 多个正则 或者匹配
元字符 : |
匹配规则:匹配A或B
data =re.findall(\'ab|af\',\'abdddddaf\') print(data) #输出[\'ab\', \'af\'] data =re.findall(\'ab| af\',\'abdddddaf\') print(data) #输出[\'ab\'] data =re.findall(\' ab| af\',\'abdddddaf\') print(data) #输出[] data =re.findall(\'ab|ag\',\'abdddddaf\') print(data) #输出[\'ab\']
(17)匹配(非)单词边界
元字符: \b \B
匹配规则 \b 匹配一个单词的边界
\B 匹配一个单词的非边界
数字字母下划线和其他字符的交界处认为是单词边界
data =re.findall(\'is\',\'My name is liis\') print(data) #输出[\'is\', \'is\'] data =re.findall(\'\bis\b\',\'My name is liis\') print(data) #输出[] data =re.findall(\'\\bis\\b\',\'My name is liis\') print(data) #输出[\'is\'] data =re.findall(r\'\bis\b\',\'My name is liis\') # r 表示原生字符串 匹配一个数字的"\\d"可以写成r"\d" print(data) #输出[\'is\']
注意: \b的两种解释是: \'\b\', 如果前面不加r, 那么解释器认为是转义字符“退格键backspace”; r\'\b\', 如果前面加r, 那么解释器不会进行转义,\b 解释为正则表达式模式中的字符串边界。 而相比于\b, \w 只有第二种解释,并没有对应的转义字符,所以不加r, 也不会出错。
data =re.findall(\'a..x\',\'a..x\') print(data) #输出[\'a..x\'] data =re.findall(\'a..x$\',\'a..x$\') print(data) #输出[] data =re.findall(\'a..x\$\',\'a..x$\') print(data) #输出 [\'a..x$\']
使用()为正则表达式分组
((ab)cd(ef)) : 表示给ab分了一个子组
obj = re.compile(\'abc\') print(obj.findall(\'abcdefj\')) data=re.findall(\'(ab)cd(ef)\',\'abcdef\') print(data) #输出[(\'ab\', \'ef\')] data=re.findall(\'(ab)cd(ef)\',\'abdcef\') print(data) #输出[] data=re.findall(\'((ab)cd(ef))\',\'abcdef\') print(data) #输出[(\'abcdef\', \'ab\', \'ef\')] data=re.findall(\'(ab)dcef\',\'abdcefyyyy\') print(data) #输出[\'ab\'] data=re.findall(\'(?:ab)dcef\',\'abdcefyyyy\') print(data) #[\'abdcef\'] data=re.findall(\'(ab)dc(ef)\',\'abdcefyyyy\') print(data) #[(\'ab\', \'ef\')] data=re.findall(\'(?:ab)dc(ef)\',\'abdcefyyyy\') print(data) #[\'ef\'] data=re.findall(\'(ab)dc(?:ef)\',\'abdcefyyyy\') print(data) #[\'ab\'] data=re.findall(\'(?:ab)dc(?:ef)\',\'abdcefyyyy\') print(data) #[\'abdcef\']
>>> re.findall(r"(abc)+", "abcabcabc") # 想要匹配多个"abc",使用分组时会优先把分组的内容返回 [\'abc\'] >>> re.findall(r"(?:abc)+", "abcabcabc") # 想要匹配多个"abc",(?:)把分组去掉,变成一个普通的字符串 [\'abcabcabc\']
data=re.findall(r\'^(\d{3})-(\d{3,8})$\', \'010-12345\') print(data) #输出的是 [(\'010\', \'12345\')] data=re.match(r\'^(\d{3})-(\d{3,8})$\', \'010-12345\') print(data.group(0)) #group() 同 group(0) 就是匹配正则表达式整体结果 print(data.group()) #===group(0) print(data.group(1)) # 输出 010 print(data.group(2)) #输出 12345 print(data.groups()) #输出 (\'010\', \'12345\')
data=re.match(\'(?P<word>[a-z]+)\', \'susu12sddd22sudd23\').group() print(data) #输出 susu data=re.match(\'(?P<word>[a-z]+)\d+\', \'susu12sddd22sudd23\').group() print(data) #输出 susu12 data=re.match(\'(?P<word>[a-z]+)\d+\', \'susu12sddd22sudd23\').group(\'word\') print(data) #输出 susu data=re.match(\'(?P<word>[a-z]+)(?P<age>\d+)\', \'susu12sddd22sudd23\').group() print(data) #输出 susu12 data=re.match(\'(?P<word>[a-z]+)(?P<age>\d+)\', \'susu12sddd22sudd23\').group(\'age\') print(data) #输出 12 data=re.match(\'(?P<word>[a-z]+)(?P<age>\d+)\', \'susu12sddd22sudd23\').group(\'word\') print(data) #输出 susu data=re.match(\'(?P<word>[a-z]+)(?P<age>\d+)\', \'susu12sddd22sudd23\').groups() print(data) #输出 (\'susu\', \'12\') data=re.match(\'(?P<word>[a-z]+)\', \'susu12sddd22sudd23\') print(data.groups()) #输出(\'susu\',)
group() 同 group(0) 就是匹配正则表达式整体结果 group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。 group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。 groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
二、re模块
compile(pattern, flags=0)
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象
obj = re.compile(\'abc\') print(obj.findall(\'abcdefj\'))
findall(string,pos ,endpos)
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
data =re.findall(\'myabc\',\'myabc hahhhh myabc\') print(data) #输出[\'myabc\', \'myabc\'] obj = re.compile(\'abc\') print(obj.findall(\'abcdefj\',pos= 0,endpos=7)) #[\'abc\'] obj = re.compile(\'abc\') print(obj.findall(\'abcdefj\',pos= 1,endpos=7)) #输出[]
split 方法按照能够匹配的子串将字符串分割后返回列表
data = re.split(\'\s+\',\'hello python\') print(data) #输出[\'hello\', \'python\']
sub(pattern,re_string,string,count)
功能:用目标字符串替换正则表达式匹配内容
参数:re_string 用什么来替换
string 要匹配的目标字符串
count 最多替换几处
返回值 : 返回替换后的字符串
subn()
返回值 : 比sub多一个实际替换的个数
data = re.sub(\'\d+\',\'++\',\'susu20sugh19myd30yunxi2\') print(data) #输出 susu++sugh++myd++yunxi++ data = re.subn(\'\d+\',\'++\',\'susu20sugh19myd30yunxi2\') print(data) #输出 (\'susu++sugh++myd++yunxi++\', 4)
match():尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
import re print(re.match(\'www\',\'www.siit.com\').span()) #起始位置匹配 print(re.match(\'com\',\'www.siit.com\')) #不在起始位置 """ 执行结果 (0, 3) None """
re.search 扫描整个字符串并返回第一个成功的匹配。
import re print(re.search(\'www\',\'www.siit.com\').span()) #起始位置匹配 print(re.search(\'com\',\'www.siit.com\').span()) #不在起始位置 """ 执行结果 (0, 3) (9, 12) """