正则表达式概念
正则表达式是对字符串操作的一种逻辑公式,是用事先定义好的一些特定字符、及这些特定字符的组合,组成一种规则字符串,从而表达一种过滤逻辑。在程序设计中,通常使用正则表达式来检索和替换那些符合某种规则(模式)的文本。
python编译正则表达式
使用python编译正则表达式时,需要引入re模块,此时可以使用正则表达式的所有功能
1. re.compile(parttern[, flags])
将正则表达式进行编译,从而使用其所有的功能,返回RegexObject对象
2. re.match(pattern, string, flags=0)
尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match就范围none
3. re.search(pattern, string, flags=0)
扫描整个字符串并返回第一个成功的匹配。
4. re.sub(pattern, repl, string, count=0, flags=0)
替换字符串中的匹配项
5. re.compile().findall(string[, pos[, endpos]])
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表
6. re.split(pattern, string[, maxsplit=0, flags=0])
按照匹配的子串将字符串分割后返回列表
7. re.compile().match().group()
group参数为0时返回得到的结果,否则为第n个子串
参数 | 描述 | 备注 |
---|---|---|
pattern | 正则表达式 | pattern = r’sa{1,2}s’ |
string | 目标字符串 | string = r’saas sas ssaads ssas’ |
flags | 匹配模式,如大小写等 | |
repl | 替换的字符串 | 可以为一个函数 |
count | 模式匹配后替换的最大次数 | 默认0表示替换所有 |
pos | 起始位置 | |
endpos | 结束位置 | |
maxsplit | 分割次数 | 默认0为不限制次数 |
简洁正则表达式
正则表达式 | 匹配字符 |
---|---|
[0-9] | 0123456789任意之一 |
[a-z] | 任意小写字母 |
[A-Z] | 人以大写字母 |
\d | 等同于[0-9] |
\D | 等同于[^0-9] |
\w | 等同于[a-z0-9A-Z_],匹配大小写字母数字和下划线 |
\W | 等同于[^a-z0-9A-Z_] |
\s | 任何空白字符,包括空格、制表符、换页符等,[ \f\n\r\t\v] |
\S | 任何非空白字符,[^ \f\n\r\t\v] |
正则表达式元字符
元字符 | 匹配规则 | 示例 |
---|---|---|
[] | 匹配括号中任意一个字符 | [adegS] |
[^] | 匹配括号内字符外都能匹配 | [^fda] |
. | 匹配任意一个字符,需要匹配该符号时使用\转义 | . |
+ | 前一个字符重复1次或多次,尽可能贪婪地多匹配 | a+ |
? | 前一个字符出现0次或1次, | a? |
+? | 前一个字符重复1次或多次,将贪婪转为懒惰 | fds+?f |
* | 前一个字符重复0次或多次,*?同理 | a* |
{a, b} | a<=前一个字符匹配次数<=b;b省略逗号保留表示至少;逗号和b一同省略表示准确数目 | a{1,2}s |
| | 逻辑或操作符 | a|b |
- | 定义一个区间 | a-c |
\ | 对下一个字符取非(通常是转义作用) | |
^ | 匹配字符串的开头 | ^a |
$ | 匹配字符串的结束 | a$ |
{\b] | 退格字符 | |
\c | 匹配一个控制字符 | |
\t | 匹配一个制表符 |
正则表达式修饰符——可选标志
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别匹配 |
re.M | 多行匹配,影响^和$ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符,影响\w \W \b \B |
re.X | 给予灵活的格式,以便将正则表达式写得更加易于理解 |
python练习
题目:在字符串sysu@hotmail.edu.cn中匹配出@hotmail.
示例代码1(错误示例)
1 | # 错误使用贪婪匹配,导致输出结果为@hotmail.edu. |
示例代码2——懒惰匹配1
2
3
4
5import re
key = r"sysu@hotmail.edu.cn"
p1 = r"@.+?\."
pattern1 = re.compile(p1)
print(partten1.findall(key))
示例代码3——非懒惰匹配1
2
3
4
5import re
key = r"sysu@hotmail.edu.cn"
p1 = r"@[^\.]+\."
pattern1 = re.compile(p1)
print(partten1.findall(key))