正则表达式
- 什么是正则表达式
- 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
- 正则表达式的使用场景
- 判断一个字符串是否符合规则。
- 取出制定数据
- 爬虫岗位较为核心的技术
- 彩票网站匹配彩票信息
- 正则表达式模块re的用法
- re模块使Python语言拥有全部的正则表达式功能。
re.match函数
-
re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()返回none.
-
函数语法:
-
re.match(pattern,string,flags=0)
-
-
函数参数说明:
-
参数 描述 pattern 匹配的正则表达式 string 要匹配的字符串 flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等 -
import re #在起始位置匹配 print(re.match(\'www\',\'www.ckk.com\').span()) #(0,3) #不在起始位置匹配 print(re.match(\'com\',\'www.runoob.com\')) #None
-
-
匹配成功re.match方法返回一个匹配的对象,否则返回None。
-
我们可以使用group(num)或groups()匹配对象函数来获取匹配表达式。
-
import re line = "Cats are smarter than dogs" # .* 表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符 # (.*?) 表示"非贪婪"模式,只保存第一个匹配到的子串 matchObj = re.match(r\'(.*) are (.*?) .*\', line, re.M | re.I) if matchObj: print("matchObj.group() : ", matchObj.group()) #matchObj.group() : Cats are smarter than dogs print("matchObj.group(1) : ", matchObj.group(1))#matchObj.group(1) : Cats print("matchObj.group(2) : ", matchObj.group(2))#matchObj.group(2) : smarter else: print("No match!!")
-
re.search方法
-
re.search扫描整个字符串并返回第一个成功的匹配
-
函数语法:
-
re.search(pattern,string,flags=0)
-
-
函数参数说明:
-
参数 描述 pattern 匹配的正则表达式 string 要匹配的字符串 flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等
-
-
匹配成功re.search方法返回一个匹配的对象,否则返回None。
-
我们可以使用group(num)或groups()匹配对象函数来获取匹配表达式。
-
匹配对象方法 描述 group(num=0) 匹配的整个表达式的字符串,group()可以一次输入多个组号,在这种情况下它将返回一个包含哪些组所对应值的元组。 groups() 返回一个包含所有小组字符串的元组,从1到所含的小组号。
-
-
示例代码:
-
import re #在起始位置匹配 print(re.search(\'www\',\'www.ckk.com\'.span()) #(0,3) #不在起始位置匹配 print(re.search(\'com\',\'www.ckk.com\'.span()) #(11,14) -
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!!") \'\'\' searchObj.group() : Cats are smarter than dogs searchObj.group(1) : Cats searchObj.group(2) : smarter \'\'\'
-
-
re.match与re.search的区别
- re.math只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None,而re.search匹配整个字符串,直到找到一个匹配。
检索和替换
-
Python的re模块提供了re.sub用于替换字符串中的匹配项。
-
语法:
-
re.sub(pattern,repl,string,count=0,flags=0)
-
-
参数:
- pattern:正则中的模式字符串。
- repl:替换的字符串,也可为一个函数、
- string:要被查找替换的原始字符串
- count:模式匹配后替换的最大次数,默认0表示替换所有的匹配。
- flags:编译时用的匹配模式,数字形式。
- 前三个为必选参数,后两个为可选参数
-
示例代码
-
import re phone = "2004-959-559 # 这是一个电话号码" # 删除注释 num = re.sub(r\'#.*$\', "", phone) print ("电话号码 : ", num)#电话号码 : 2004-959-559 # 移除非数字的内容 num = re.sub(r\'\D\', "", phone) print ("电话号码 : ", num)#电话号码 : 2004959559
-
-
repl参数是一个函数
-
import re # 将匹配的数字乘于 2 def double(matched): value = int(matched.group(\'value\')) return str(value * 2) s = \'A23G4HFD567\' print(re.sub(\'(?P<value>\d+)\', double, s))#A46G8HFD1134
-
compile函数
-
compile函数用于编译正则表达式,生成一个正则表达式(pattern)对象,供match()和search()这两个函数使用。
-
语法格式为:
-
re.compile(pattern[,flags])
-
-
参数:
- pattern:一个字符串形式的正则表达式
- Flags:可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
- re.l忽略大小写
- re.L:表示特殊字符集\w,\W,\b,\B,\s,\S依赖于当前环境
- re.M:多行模式
- re.S:即为’.‘并且包括换行符在内的任意字符(\'.\'不包括换行符)
- re.U:表示特殊字符集\w,\W,\b,\B,\s,\S依赖于Unicode字符属性数据库
- re.X:为了增加可读性,忽略空格和\'#\'后面的注释
-
示例代码:
-
>>>import re >>> pattern = re.compile(r\'\d+\') # 用于匹配至少一个数字 >>> m = pattern.match(\'one12twothree34four\') # 查找头部,没有匹配 >>> print( m ) None >>> m = pattern.match(\'one12twothree34four\', 2, 10) # 从\'e\'的位置开始匹配,没有匹配 >>> print( m ) None >>> m = pattern.match(\'one12twothree34four\', 3, 10) # 从\'1\'的位置开始匹配,正好匹配 >>> print( m ) # 返回一个 Match 对象 <_sre.SRE_Match object at 0x10a42aac0> >>> m.group(0) # 可省略 0 \'12\' >>> m.start(0) # 可省略 0 3 >>> m.end(0) # 可省略 0 5 >>> m.span(0) # 可省略 0 (3, 5)
-
-
在上面,当匹配成功时返回一个match对象,其中:
-
group([group1, …])方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用group()或group(0); -
start([group])方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0; -
end([group])方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0; -
span([group])方法返回(start(group), end(group))。
-
findall
-
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
-
注意:
- match和search是匹配一次。
- findall匹配所有
-
语法格式为:
-
re.findall(pattern,string,flags=0) 或者 pattern.findall(string[,pos[,endpos]])
-
-
参数:
- pattern:匹配模式
- string:待匹配的字符串
- pos:可选参数,指定字符串的起始位置,默认为0
- endpos:可选参数,指定字符串的结束位置,默认为字符串的长度。
-
查找字符串中的所有数字:
-
import re result1 = re.findall(r\'\d+\',\'runoob 123 google 456\') pattern = re.compile(r\'\d+\') # 查找数字 result2 = pattern.findall(\'runoob 123 google 456\') result3 = pattern.findall(\'run88oob123google456\', 0, 10) print(result1)#[\'123\', \'456\'] print(result2)#[\'123\', \'456\'] print(result3)#[\'88\', \'12\']
-
re.finditer
-
和findall类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
-
re.finditer(pattern,string,flags=0)
-
-
参数:
-
参数 描述 pattern 匹配的正则表达式 string 要匹配的字符串 flags 标志位,用于控制正则表达式的匹配方式。
-
-
示例代码:
-
import re it = re.finditer(r"\d+","12a32bc43jf3") for match in it: print (match.group() ) \'\'\' 12 32 43 3 \'\'\'
-
re.split
-
split方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下
-
re.split(pattern,string[,maxsplit=0,flags=0])
-
-
参数:
-
参数 描述 pattern 匹配的正则表达式 string 要匹配的字符串 maxsplit 分割次数,maxsplit=1 分割一次,默认为0,不限制次数。 flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:[正则表达式修饰符 - 可选标志]
-
-
示例代码
-
>>>import re >>> re.split(\'\W+\', \'runoob, runoob, runoob.\') [\'runoob\', \'runoob\', \'runoob\', \'\'] >>> re.split(\'(\W+)\', \' runoob, runoob, runoob.\') [\'\', \' \', \'runoob\', \', \', \'runoob\', \', \', \'runoob\', \'.\', \'\'] >>> re.split(\'\W+\', \' runoob, runoob, runoob.\', 1) [\'\', \'runoob, runoob, runoob.\'] >>> re.split(\'a*\', \'hello world\') # 对于一个找不到匹配的字符串而言,split 不会对其作出分割 [\'hello world\']
-
正则表达式对象
- re.RegexObject
- re.compile()返回RegexObject对象。
- re.MatchObject
- group()返回被RE匹配的字符串
- start():返回匹配开始的位置
- end():返回匹配结束的位置
- span():返回一个元组包含匹配(开始,结束)的位置
正则表达式修饰符--可选标志
-
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位OR()它们来指定。如re.l。re.M被设置成I和M标志:
-
-
正则表达式模式
- 模式字符串使用特殊的语法来表示一个正则表达式。
- 字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。
- 多数字母和数字前加一个反斜杠时会拥有不同的含义。
- 标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
- 反斜杠本身需要使用反斜杠转义。
- 由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r\'\t\',等价于 \t )匹配相应的特殊字符。
- 下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。
正则表达式实例
-
字符匹配
-
实例 描述 python 匹配 "python". -
字符类
-
特殊字符类