Python的中 re 模块,主要是用来处理正则表达式,还可以利用 re 模块通过正则表达式来进行网页数据的爬取和存储。
正则表达式的英文是 regular expression,通常简写为 regex、regexp 或者RE,属于计算机领域的一个概念。
正则表达式的主要作用是被用来进行文本的检索、替换或者是从一个串中提取出符合我们指定条件的子串,它描述了一种字符串匹配的模式 pattern 。
目前正则表达式已经被集成到了各种文本编辑器和文本处理工具中。
下面给出一个简单的示例:
^[ 0 - 9 ] + a b c $
-
^ 为匹配输入字符串的开始位置。
-
[0-9] 匹配单个数字。
-
+ 匹配一个或者多个。
-
[0-9]+匹配一个或多个数字。
-
$ 为匹配输入字符串的结束位置。
-
abc$匹配字母 abc 并以 abc 结尾。
^[a-zA-Z0-9_-]{3,15}$
- ^表示匹配字符串的开头。
[a-zA-Z0-9_-]
表示字符集,包含小写字母、大写字母、数字、下划线和连接字符 -。{3,15}
表示前面的字符集最少出现 3 次,最多出现 15 次,从而限制了用户名的长度在 3 到 15 个字符之间。$
表示匹配字符串的结尾。
^[0-9]+abc$
匹配以数字开头,并以 abc 结尾的字符串。
先介绍常用正则表达式中几种特殊字符的功能:
字符 | 含义 | 例子 |
---|---|---|
. | 匹配任意一个字符 | ab.可以匹配abc或者abd |
[ ] [^ ] | 匹配括号中的任意1个字符 匹配除了括号内的字符以外的任意一个字符 | [abcd]可以匹配a、b、c、d
|
- | 在[ ]内表示的字符范围内进行匹配 | [0-9a-fA-F]可以匹配任意一个16进制的数字 |
^ | 位于[ ]括号内的开头,匹配除括号中的字符之外的任意1个字符 | [^xy]匹配xy之外的任意一个字符,比如[^xy]1可以匹配A1、B1但是不能匹配x1、y1 |
数量限定符
字符 | 含义 | 例子 |
---|---|---|
? | 匹配前面紧跟字符的0次或者1次 | [0-9]?,匹配1、2、3 |
+ | 匹配前面紧跟字符的1次或者多次 | [0-9]+,匹配1、12、123等 |
* | 匹配前面紧跟字符的0次或者多次 | [0-9]*,不匹配或者12、123(待验证) |
{N} | 匹配前面紧跟字符精确到N次 | [1-9][0-9]{2},匹配100到999的整数,{2}表示[0-9]匹配两个数字 |
{,M} | 匹配前面紧跟字符最多M次 | [0-9]{,1},指的是最多匹配0-9之间的1个整数,相当于是0次或者1次,等价于[0-9]? |
{N,M} | 匹配前面紧跟字符的至少N次,最多M次 | [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3},匹配IP地址,其中.号是特殊字符,需要使用转义字符\ |
在 Python 中主要是利用 re 模块进行正则表达式的处理,涉及到 4 个常用的方法:
re.match()
re.search()
re.findall()
re.sub()
re.split()
import re # 使用之前先进行导入re模块
re 模块简介
re模块主要定义了9个常量、12个函数、1个异常,每个常量和函数siki学院都会通过实际代码案例讲解,让大家能更直观的了解其作用!标准库的意思表示这是一个Python内置模块,不需要额外下载,目前Python内置模块大概有300个。可以在这里查看Python所有的内置模块:
re模块简介聊到Python正则表达式的支持,首先肯定会想到re库,这是一个Python处理文本的标准库。
re.match(pattern, string, flags)
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 |
标志位 flags
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志,如 re.I | re.M 被同时设置成 I 和 M 标志:
修饰符 | 描述 |
---|---|
re.I | 忽略大小写(常用) |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予更灵活的格式,以便将正则表达式写得更易于理解。 |
match
从指定字符串的开始位置进行匹配。开始位置匹配成功则继续匹配,否则输出None。
该方法的结果是返回一个正则匹配对象,通过两个方法获取相关内容:
- 通过 group() 来获取内容
- 通过 span() 来获取范围:匹配到字符的开始和结束的索引位置
re.match(pattern, string, flags) # match方法为例
示例代码:
import re
print(re.match('www', 'www.bd.com').span()) # 在起始位置匹配
print(re.match('com', 'www.bd.com')) # 不在起始位置匹配
line = "Cats are smarter than dogs"
matchObj = re.match(r'(.*) are (.*?) .*', line, re.M | re.I)
if matchObj:
print("matchObj.group() : ", matchObj.group())
print("matchObj.group(1) : ", matchObj.group(1))
print("matchObj.group(2) : ", matchObj.group(2))
else:
print("No match!!")
运行结果:
(0, 3)
None
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
位置相关
字符 | 含义 | 例子 |
---|---|---|
^ | 匹配开头的位置;通过\A | ^hello 匹配hello开头的字符内容 |
$ | 匹配结束的位置同\Z | ;$ 匹配一行结尾的;符号 ^$匹配空行 |
< | 匹配单词开头的位置 | <th 匹配…this但是不能匹配ethernet等 |
> | 匹配单词结尾的位置 | p> 匹配leap等,但是不能匹配parent、sleepy等不是p结尾的单词 |
\b | 匹配单词开头或结尾的位置 | \bat 匹配…at…,但是不能匹配cat、atexit、batch(非at开头) |
\B | 匹配非单词开头或者结尾的单词 | \Bat匹配battery,但是不能匹配attend/hat等以at开头的单词 |
特殊字符
字符 | 含义 | 例子 |
---|---|---|
\ | 转义字符,保持后面字符的原义,使其不被转义 | \. 输出. |
( ) | 将表达式的一部分括起来,可以对整个单元使用数量限定符,匹配括号中的内容 | ([0-9]{1,3}\.){3}[0-9]{1,3}表示将括号内的内容匹配3次 |
| | 连接两个子表达式,相当于或的关系 | n(o|either)匹配no或者neither |
\d | 数字字符 | 相当于是[0-9] |
\D | 非数字字符 | 相当于是[^0-9] |
\w | 数字字母下划线 | [a-zA-Z0-9_] |
\W | 非数字字母下划线,匹配特殊字符 | [^\w] |
\s | 空白区域 | [\r\t\n\f]表格、换行等空白区域 |
\S | [^\s] | 非空白区域 |
贪婪模式与非贪婪模式:
- .*? 非贪婪模式
- .* 贪婪模式
import re
str = "aaaacbabadceb"
res = re.findall("a.*?b", str)
res1 = re.findall("a.*b", str)
str2 = "aaaacbabadcebfegbbb"
res2 = re.findall("a.*b", str2)
print(res)
print(res1)
print(res2)
运行结果为:
['aaaacb', 'ab', 'adceb']
['aaaacbabadceb']
['aaaacbabadcebfegbbb']
- 在上面的非贪婪模式中,使用了问号 ?,当匹配到 aaaacb 已经达到了要求,停止第一次匹配;接下来再开始匹配到 ab ;再匹配到 adceb ;所以存在多个匹配结果
- 在贪婪模式中,程序会找到最长的那个符合要求的字符串