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 模块来使用正则表达式功能
import re
re.compile
compile 函数的返回值是一个 pattern
(正则表达式对象),是用来自己定义正则表达式的函数,下面的句子是描述一个以 he 开头,后面接任意字符,并且以 o 结尾的字符串的正则表达式,例如 hello
pattern = re.compile(r'^(he)+.*o$')
re.match
match 函数是根据给定的正则表达式,来判定一个字符串是否符合规则的函数,匹配成功返回一个 match 对象,否则返回 None,下面是以上边 compile 函数返回的正则表达式为基础,对字符串检测的语句
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 到 所含的小组号
result.group()
# 返回一个包含 num 指定小组所对应值的元组
result.group(num)
re.search
search 函数的用法和 match 函数很接近,search 函数会扫描整个字符串并返回第一个成功的匹配,也是一个 match 对象,使用的参数也与 match 函数相同
res = re.search(pattern1, str)
res = re.search(pattern1, str, re.l)
二者的区别在于,match 函数只匹配字符串的开始,如果开始不符合,就会匹配失败,而 search 函数会匹配整个字符串,直到找到一个匹配
re.findall
findall 函数会找到字符串中所有符合正则表达式规则的字符串,返回值是一个列表,如果没有匹配,就会返回一个空列表
res1 = re.findall(pattern1, str)
re.finditer
finditer 也是查找所有符合正则表达式规则的字符串,不同的是返回值,finditer 返回的是一个迭代器,用法如下
for item in re.finditer(pattern1, str):
print(item.group())
小样例
常用的正则表达式:
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}$