概述:正则表达式是有自己特定语法结构的处理字符串的工具。
字符 | 含义 |
---|---|
. | 匹配任意单个字符(不包括换行符\n) |
\ | 转义字符 |
[…] | (对应字符集中任意字符) |
| | 或 |
.:匹配任意单个字符,如a.c可以匹配的结果为abc,avc等。
\:转义字符,如\n
[…]:在括号中任选一个,如a[bcd],匹配的结果为ab,ac,ad。
|:a|b匹配a或b
预定义字符集 | 含义 |
---|---|
\d | 匹配一个数字字符。等价于[0-9] |
\D | 匹配一个非数字字符。等价于[^0-9] |
\s | 匹配任何空白字符,包括空格,制表符,换页符等。等价于[\f\n\r\t\v] |
\S | 匹配任何非空白字符,等价于[^\f\n\r\t\v] |
\w | 匹配字母,数字以及下划线。 |
\W | 匹配不是字母、数字以及下划线的字符。 |
\f:换页符
\r:回车符(与\n有区别)
\v:垂直制表
数量词 | 含义 |
---|---|
* | 匹配前一个字符0或无限次 |
+ | 匹配前一个字符1或无限次 |
? | 匹配前一个字符0或1次 |
{m} | 匹配前一个字符m次 |
{m,n} | 匹配前一个字符m至n次 |
*:如abc匹配ac,abc,abbc等
+:如abc匹配abc,abbc,abbbc等
?:ab?c匹配ac,abc
{m}:如ab{3}c匹配abbbc
{m,n}:如ab{2,4}匹配abbc,abbbc和abbbbc
边界匹配 | 含义 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\A | 匹配字符串开头 |
\Z | 匹配字符串结尾,若存在换行,仅匹配到换行前的字符串 |
利用此库,可以在Python中使用正则表达式
①基本用法
语法:re.match(pattern, string, flags=0)
作用:尝试从字符串起始位置匹配正则表达式
参数:
pattern:匹配的正则表达式
string:要匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等,接收标志修饰符
返回值:若匹配成功,返回结果;若失败,返回None。
示例:
import re
string = 'Hello fly 123 4567 World_Cup is a Range Refuge '
re_string = 'Hello\s\D{3}\s\d{3}\s\d{4}\s\w{9}'
result = re.match(string=string,pattern=re_string)
print(result)
print(result.group())#方法group(),输出匹配到的内容
print(result.span())#方法span(),输出匹配的范围
②匹配目标
用()将像提取的子字符串括起来,以标记一个子字符串的起始位置和结束位置,被标记的子字符串会依次对应每一个分组,向group()传递索引可以获取想要的结果。
import re
string = 'Hello fly 123 4567 World_Cup is a Range Refuge '
re_string = 'Hello\s(\D{3})\s\d{3}\s(\d{4})\s\w{9}'
result = re.match(string=string,pattern=re_string)
print(result)
print(result.group(1))
print(result.group(2))
③通用匹配
万能匹配组合:.*
目的:简化正则表达式的书写
import re
string = 'Hello fly 123 4567 World_Cup is a Range Refuge'
re_string = '^Hello.*Range'
result = re.match(string=string,pattern=re_string)
print(result)
④贪婪与非贪婪
贪婪匹配:
一般情况下,.*会尽可能多的匹配字符。
import re
string = 'Hello fly 123 4567 World_Cup is a Range Refuge'
re_string = '^Hello.*(\d+).*Range'
result = re.match(string=string,pattern=re_string)
print(result)
print(result.group(1))
非贪婪匹配:
写法:.*?
尽可能少的匹配字符。
import re
string = 'Hello fly 123 4567 World_Cup is a Range Refuge'
re_string = '^Hello.*?(\d+\s\d+).*Range'
result = re.match(string=string,pattern=re_string)
print(result)
print(result.group(1))
注意:/(.*)放在结尾,可能无法匹配任何内容
import re
string = 'Hello fly 123 4567 World_Cup is a Range Refuge'
re_string = '^Hello.*?\d+\s\d+.*Range\s(.*?)'
result = re.match(string=string,pattern=re_string)
print(result.group(1))
re_string = '^Hello.*?\d+\s\d+.*Range\s(.*)'
result = re.match(string=string,pattern=re_string)
print(result.group(1))
⑤修饰符
修饰符 | 描述 |
---|---|
re.I | 是匹配对大小写不敏感 |
re.S | 使.匹配包括\n在内的所有字符 |
反例:
import re
string = 'Hello fly 123 4567 World_Cup is '\
'\na Range Refuge'
re_string = '^Hello.*?\d+\s\d+(.*)Range\s'
result = re.match(string=string,pattern=re_string)
print(result.group())
此时,抛出错误提示
正确做法:
import re
string = 'Hello fly 123 4567 World_Cup is '\
'\na Range Refuge'
re_string = '^Hello.*?\d+\s\d+(.*)Range\s'
result = re.match(string=string,pattern=re_string,flags=re.S)
print(result.group())
⑥转义匹配
当遇到用于正则匹配模式的特殊字符时,前加\即可
match()更适合用于检测某个字符串是否符合某个正则表达式的规则。
search()在匹配时会扫描整个字符串。
返回值:返回第一个匹配的结果,若遍历完了还未找到,就返回None。
引例:
import re
string = 'Hello fly 123 4567 World_Cup is '\
'a Range Refuge'
re_string = '\d{4}'
result = re.search(string=string,pattern=re_string)
print(result.group())
实例:
尝试从该段html文档中提取class为active的li节点内部的超链接所包含的歌手名和歌名。
import re
html='''
'''
re_string = '(.*?)'
result = re.search(string=html,pattern=re_string,flags=re.S)
print(result.group(1),result.group(2))
功能:获取匹配正则表达式的所有内容
返回值:匹配正则表达式的所有内容,列表类型
import re
html='''
'''
re_string = '(.*?)'
results = re.findall(string=html,pattern=re_string,flags=re.S)
print(results)
借用正则表达式来修改文本。
函数原型:sub(pattern, repl, string, count=0, flags=0)
pattern:正则中的模式字符串
repl:要替换的字符串(匹配pattern后将其替换为repl),可以是个函数
string:要修改的字符串
count:修改的最大次数
flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等,接收标志修饰符
返回值:返回修改后的字符串
引例:
import re
content = 'sadada112132adsf231asda'
re_string = '\d+'
result = re.sub(pattern=re_string,repl='',string=content)
print(result)
实例:
目的:获取所有li节点的歌名
思路:先修改html文件,再用findall()获取
import re
html='''
'''
re_string = '|'
modified_html = re.sub(pattern=re_string,string=html,repl='')
re_string = '(.*?)'
result = re.findall(pattern=re_string,string=html,flags=re.S)
print(result)
可将正则字符串编译成正则表达式对象,以便在后面的匹配中复用。
函数原型:compile(pattern, flags=0)
返回:匹配的对象,如:与findall()一起使用,返回一个列表
单独使用毫无意义,常常和search(),findall(),match()一起使用
例子:
import re
content1 = 'Hello,I am Lily.'
content2 = 'Hello,I am Lucy.'
re_string = '\s.*?\.'
pattern = re.compile(pattern=re_string)
result1 = re.sub(pattern=pattern,string=content1,repl='')
result2 = re.sub(pattern=pattern,string=content2,repl='')
print(result1)
print(result2)