概念:正则表达式主要是为了文本匹配所产生的,简单来说,正则表达式是所需查找字符的标准模板,例如在一段话中查找AABB式的成语,这里的AABB就是正则表达式。由于需求众多,因此要求规范,因而学习。
匹配方式
python中内置增加re模块,他为python语言提供了正则表达式的功能。
首先,正则表达式主要的匹配方式模块有:match,search,findall
先来基础的讲一下他们
1.match:(从开头匹配)若开头匹配失败,则返回None
语法:re.match(pattern, string, flags=0)
pattern:匹配的正则表达式 string:要匹配的字符串 flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
返回结果(以match为例)
match匹配成功返回一个匹配的对象,否则返回None
同时,我们可以采用一些方法加工返回的内容
group() 返回匹配到的字符串
group(num=0) | 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。 |
groups() | 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。 |
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元组包含匹配 (开始,结束) 的位置
import re #引入模块
a = '1234huvjkj'
b = re.match('12',a)
print(b) #返回对象
print(b.span()) #返回位置
print(b.group()) #返回匹配到的字符串
另:还可采用另一种形式(语法2)
在这里,介绍另一种函数 re.compile()
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
格式:pattern = re.compile('pattern')
pattern.search('string',start,end)
string:要匹配的字符串
start:匹配的起始位置
end:终止位置
示例如下:
import re #引入模块
pattern = re.compile('\d+')
print(pattern.search('34456jk12j',0,2))
print(pattern.search('34456jk12j',0,10))
2.search(从前往后寻找,返回匹配到的第一个)
与match用法基本相同,上述函数方法都适用
3.findall(将所有匹配到的都返回)
与前两者有区别,在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。
最后一个函数了,re.split ()
split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:
re.split(pattern, string[, maxsplit=0, flags=0])
maxsplit | 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 |
flags : 可选,表示匹配模式,具体参数为:
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
正则表达式的规范符号
单字符匹配
. 匹配任意一个字符(除\n)
\d 匹配任意一个数字(0-9)
\D 匹配任意一个非数字(除0-9)
\s 匹配任意一个空白(空格\n,换行,tab,\r...)
\S 匹配任意一个非空白
\w 匹配任意一个单词字符(0-9,a-z,A-Z, _ )
\W 匹配任意一个非单词字符
[] 匹配其中之一([0,1,2,3] 匹配到0,1,2,3任意一个即可)
[...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re{ n} | 精确匹配 n 个前面表达式。例如, o{2} 不能匹配 "Bob" 中的 "o",但是能匹配 "food" 中的两个 o。 |
re{ n,} | 匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。"o{1,}" 等价于 "o+"。"o{0,}" 则等价于 "o*"。 |
re{ n, m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
a| b | 匹配a或b |
特殊字符:
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。 |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置。 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 |
\B | 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 |
\n, \t, 等. | 匹配一个换行符。匹配一个制表符。等 |
多字符匹配
re* | 匹配0个或多个的表达式。 |
re+ | 匹配1个或多个的表达式。 |
re? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
1. *
import re #引入模块
a = '111234huvjkj'
b = re.match('1*',a)
print(b)
输出结果:<re.Match object; span=(0, 3), match='111'>
2. +
与*十分类似,区别看举例:
import re #引入模块
a = 'huvjkj'
b = re.match('\d+',a)
print(b)
输出:None
import re #引入模块
a = 'huvjkj'
b = re.match('\d*',a)
print(b)
输出:<re.Match object; span=(0, 0), match=''>
3. ?主要是贪婪与非贪婪问题
无?的情况下,尽可能多的匹配(出现在多字符匹配中);有?的情况下,尽可能少的匹配。
4.^和$——开头,结尾
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾。 |