Python——正则表达式

Python 中的正则表达式

​ 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定的字符串、及这些特定字符的组合,组成一个”规则字符串“,这个规则字符串用来表示对字符串的一种过滤逻辑

​ 字符串是编程时涉及到的最多的一种数据结构,使用正则表达式可以完成判断一个字符串是否为合法电话号、是否是 Email 格式等操作

​ 文章最后符一些常用的正则表达式!

正则表达式通用符号及解释

模式 描述
. 匹配任意除 \n外的字符
\ 转义字符,是一个特殊字符原来的意思
[…] 对应位置可以是字符集中的任意字符
\d 数字(0~9)
\D 非数字
\s 空白字符(空格、\t、\r、\n、\f、\v)
\S 非空白字符
\w 单词字符(AZ、az、0~9)
\W 非单词字符
* 匹配前一个字符 0 或 无限次
+ 匹配前一个字符 1 或 无限次
匹配前一个字符 0 或 1 次
{m} 匹配前一个字符串 m 次
{m, n} 匹配前一个字符串 m 至 n 次
^ 匹配字符串开头
$ 匹配字符串末尾
\A 仅匹配字符串开头
\Z 仅匹配字符串末尾
\b 匹配 \w 和 \W 之间
\B 与上一个相反

re 模块

​ python 通过导入 re 模块来使用正则表达式功能

1
import re

re.compile

​ compile 函数的返回值是一个 pattern(正则表达式对象),是用来自己定义正则表达式的函数,下面的句子是描述一个以 he 开头,后面接任意字符,并且以 o 结尾的字符串的正则表达式,例如 hello

1
pattern = re.compile(r'^(he)+.*o$')

re.match

​ match 函数是根据给定的正则表达式,来判定一个字符串是否符合规则的函数,匹配成功返回一个 match 对象,否则返回 None,下面是以上边 compile 函数返回的正则表达式为基础,对字符串检测的语句

1
2
3
4
5
6
7
8
9
result = re.match(pattern, 'hello')
result = re.match(pattern, 'hello', re.l)
# match 函数的第三个参数 flag 为可选参数,表示标志位,用于控制正则表达式的匹配方式,有如下用法:
# re.l 使匹配对大小写不敏感
# re.L 使匹配对大小写不敏感
# re.M 多行匹配
# re.S 使 . 匹配包括换行在内的左右字符
# re.U 根据 Unicode 字符集解析字符
# re.X 使格式更灵活,以便正则表达式更易于理解

match.group

​ 这个函数是用来获取匹配后的字符串的,它的返回值是一个元组

1
2
3
4
# 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号
result.group()
# 返回一个包含 num 指定小组所对应值的元组
result.group(num)

​ search 函数的用法和 match 函数很接近,search 函数会扫描整个字符串并返回第一个成功的匹配,也是一个 match 对象,使用的参数也与 match 函数相同

1
2
res = re.search(pattern1, str)
res = re.search(pattern1, str, re.l)

​ 二者的区别在于,match 函数只匹配字符串的开始,如果开始不符合,就会匹配失败,而 search 函数会匹配整个字符串,直到找到一个匹配

re.findall

​ findall 函数会找到字符串中所有符合正则表达式规则的字符串,返回值是一个列表,如果没有匹配,就会返回一个空列表

1
res1 = re.findall(pattern1, str)

re.finditer

​ finditer 也是查找所有符合正则表达式规则的字符串,不同的是返回值,finditer 返回的是一个迭代器,用法如下

1
2
for item in re.finditer(pattern1, str):
print(item.group())

小样例

​ 常用的正则表达式:

1
2
3
4
5
6
7
8
9
10
11
12
13
1. Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

2. 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?

3. InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

4. 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$

5. 电话号码("XXX-XXXXXXX""XXXX-XXXXXXXX""XXX-XXXXXXX""XXX-XXXXXXXX""XXXXXXX""XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$

6. 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}

7. 身份证号(15位、18位数字):^\d{15}|\d{18}$
-------------本文结束感谢您的阅读-------------