sugh

正则表达式

定义:

即高级文本匹配模式,提供了搜索,替代等功能,本质是由一些字符和特殊符号组成的字串。这个字串描述了字符和字符的重复行为,可以匹配某一类特征的字符串集合。

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)
"""

 

分类:

技术点:

相关文章: