一.正则表达式
正则表达式是一个用特殊符号表示的字符序列,用来检查一个字符串是否与某种字符串模式匹配。
较常用的正则表达式有:
正则表达式
匹配对象
普通字符
匹配对应的字符
\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:
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:
正则表达式前的
r
的含义指此字符串为一普通字符串,即转义字符
不使用其转义含义
。
(2)
re.search(pattern, string, flags)
函数的形参意义同上,此函数是扫
整个模式串
进行匹配,不用像match那样必须包括模式串起始位置。
例子的正则表达式的含义:从y开始,然后后面可以包括零个或多个除了换行符之外的字符(详细看上面表格中各正则表达式的组合含义)。
(字符串的匹配默认为贪心方式:即如果满足条件则匹配越多越好)。
print(re.search("y.*","pypypy"))
#out:
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']
这两种字符组合在一起后即表示精准模式,即匹配成功就停止。