一.正则表达式
正则表达式是一个用特殊符号表示的字符序列,用来检查一个字符串是否与某种字符串模式匹配。
较常用的正则表达式有:
正则表达式 | 匹配对象 |
普通字符 | 匹配对应的字符 |
\n | 匹配换行符 |
\t | 匹配制表符 |
\d | 匹配十进制数字 |
\D | 匹配除了十进制数字的其他字符 |
\w | 匹配字母,数字,下划线 |
\W | 匹配除了字母,数字,下划线的其他字符 |
\s | 匹配空白字符(space) |
\S | 匹配除了空白字符的其他字符 |
[xxxxx] | 匹配[]内的任意一个 |
[^xxxx] | 匹配除了[]内xxxx的任意字符 |
. | 匹配除换行符外的任意一个 |
^ | 匹配字符串起始位置 |
$ | 匹配字符串结尾位置 |
* | 前一个字符出现0或1或…次 |
? | 前一个字符出现0或1次 |
+ | 前一个字符出现1或多次 |
{n} | 前一字符恰好出现n次 |
{n,} | 前一个字符至少出现n次 |
{n,m} | 前一个字符出现n~m次 |
() | 模式匹配单元:()内为要提取的内容 |
记忆:
1."\小写"和"\大写"互为否定(例:\d匹配十进制数字,\D则匹配非十进制数字)。
2.“在原子表[]内,^符号表示取否定意义”(例:[123]匹配123内任意一个,[ ^123]匹配除了123的其他任意字符)
二.python处理正则表达式
python处理正则表达式主要通过re模块,处理时import该模块。
import re
主要介绍re模块中三个较常用的匹配函数(match,search,findall):
(1)re.match(pattern, string, flags)
函数的三个参数分别为正则表达式,模式串,可选参数(修改匹配某些规则)
常用的可选参数及其含义:
可选参数 | 含义 |
re.I | 使匹配忽略大小写 |
re.S | 使.也可以匹配换行符 |
从模式起始位置匹配模式串,若从起始位置匹配不成功,match()就返回none[即:匹配成功的位置必须包括起始处]
print(re.match(r"py","python"))
#out:<re.Match object; span=(0, 2), match='py'>
print(re.match(r"py","python").span())#span()返回匹配位置索引
#out:(0, 2)
print(re.match(r"py","python").group())#返回匹配到的对象
#out:py
print(re.match(r"th","python"))#不能从模式串的起始位置匹配
#out:None
print(re.match(r"Py","python",re.I))#可选参数使匹配不区分大小写
#out:<re.Match object; span=(0, 2), match='py'>
正则表达式前的r的含义指此字符串为一普通字符串,即转义字符不使用其转义含义。
(2)re.search(pattern, string, flags)
函数的形参意义同上,此函数是扫整个模式串进行匹配,不用像match那样必须包括模式串起始位置。
例子的正则表达式的含义:从y开始,然后后面可以包括零个或多个除了换行符之外的字符(详细看上面表格中各正则表达式的组合含义)。
(字符串的匹配默认为贪心方式:即如果满足条件则匹配越多越好)。
print(re.search("y.*","pypypy"))
#out:<re.Match object; span=(1, 6), match='ypypy'>
print(re.search("y.*","pypypy").span())
#out:(1, 6)
print(re.search("y.*","pypypy").group())
#out:ypypy
print(re.search("a.*","pypypy"))
#out:None
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
(3)re.findall(string,start(起始位置索引,可选,默认为0),end(结束位置索引,不包括该位置,可选,默认为len))
在字符串中找到正则表达式所匹配的所有子串
(注意: match 和 search 是匹配一次 ,findall 匹配所有)
同时,使用findall要先把正则表达式编译出来,这里要用到另一个函数compile(pattern,flag)用来编译字符串(可写入可选参数修改匹配规则)。
reg=r"py*"#匹配p及连着0个或多个y
print(re.compile(reg).findall("py-Py-pyy"))
#out:['py', 'pyy']
print(re.compile(reg,re.I).findall("py-Py-pyy"))#匹配不区分大小写
#out:['py', 'Py', 'pyy']
print(re.compile(reg).findall("py-Py-pyy",1,7))#指定起始及终止位置
#out:['p']
三.匹配方式
主要分为两种方式:
1.贪心/贪婪模式(默认为这种模式)
此方式即为在满足条件的情况下匹配的字符越多越好。
reg=r"py*"
#匹配p及连着0个或多个y,贪婪模式匹配满足条件的最多个y
print(re.compile(reg).findall("py-Py-pyy"))
#out:['py', 'pyy']
2.精准/懒惰模式:
(1)*?
(2)+?
reg=r"py*?"
#此*?组合开启精准模式,原来y可匹配0个或多个,现在匹配最少(即0个就结束)
print(re.compile(reg).findall("py-Py-pyy"))
#out:['p', 'p']
这两种字符组合在一起后即表示精准模式,即匹配成功就停止。