Python工程语法(正则表达式)
正则表达式是一个特殊的字符序列,方便的检查一个字符串是否与某种模式匹配。re模块使Python拥有正则表达式功能。
1. 字符匹配
正则表达式在网络爬虫、数据分析中有着广泛使用,掌握正则表达式能够达到事半功倍的效果。
1.1 方法和功能
方法 | 功能 |
---|---|
match() | 判断一个正则表达式是否从开始处匹配一个字符串 |
search() | 遍历字符串,找到正则表达式匹配的第一个位置,返回匹配对象 |
findall() | 遍历字符串,找到正则表达式匹配的所有位置,并以列表的形式返回。如果给出的正则表达式中包含子组,就会把子组的内容单独返回,如果有多个子组就会以元组的形式返回。 |
finditer() | 遍历字符串,找到正则表达式匹配的所有位置,并以迭代器的形式返回 |
findall( , )
findall([ ],)
findall([^ ], ) 来找除了[]里面的字符
[a-z]匹配a~z的任意字符([0-9]也可以)
.匹配除了换行符以外的任意字符
贪婪匹配,匹配符合条件的最长的字符串
".? 字符串 " ,用来确定匹配的字符串前面有一个或者没有字符都符合要求
1.2 特殊字符
特殊字符 | 含义 |
---|---|
\d | 匹配任何十进制数字;相当于类 [0-9] |
\D | 与 \d 相反,匹配任何非十进制数字的字符;相当于类 0-9 |
\s | 匹配任何空白字符(包含空格、换行符、制表符等);相当于类 [ \t\n\r\f\v] |
\S | 与 \s 相反,匹配任何非空白字符;相当于类 \t\n\r\f\v |
\w | 匹配任意一个文字字符,包括大小写字母、数字、下划线,等价于表达式[a-zA-Z0-9_] |
\W | 于 \w 相反 (注:re.ASCII 标志使得 \w 只能匹配 ASCII 字符) |
\b | 匹配单词的开始或结束 |
\B | 与 \b 相反 |
\w 匹配字母数字下划线(汉字)
\d匹配数字
\s匹配任意空白符 包括空格,制表符等等
2. 数量控制
控制匹配规则的重复次数~
2.1 *重复0次或多次
2.2 +重复1次或多次
2.3 ?重复1次或0次
2.4 {n}重复n次
2.5 {n,}重复n次或多次
2.6 {n,m}重复n到m次
3. 分组
()提取兴趣区域
(|)提取兴趣区域(| = or)
解释:
(?:主角团的|爱吃小面包的)
:这是一个非捕获组,匹配“主角团的”或“爱吃小面包的”,但不会捕获这些前缀。
([\u4e00-\u9fa5a-zA-Z·]+)
:这是一个捕获组,匹配一个或多个汉字、字母或特殊字符(如·),用于提取名字部分。
4. 开始和结束
^开始
$结尾
5. 特殊字符
由于正则表达式中* . \ {} () 等等符号具有特殊含义,如果你指定的字符正好就是这些符号,需要用\进行转义
6. 常用方法
6.1 re.findall
获取匹配到的所有数据
6.2 re.match
从字符串的起始位置匹配,成功返回一个对象否则返回none。
匹配成功返回对象,对象的方法:
方法 | 功能 |
---|---|
group() | 返回匹配的字符串 |
start() | 返回匹配的开始位置 |
end() | 返回匹配的结束位置 |
span() | 返回一个元组表示匹配位置(开始,结束) |
6.3 re.search
扫描整个字符串并返回第一个成功匹配的字符串。成功返回一个对象否则返回none
6.4 re.sub
替换匹配成功的字符
类似与字符串的replace函数
6.5 re.split
根据匹配成功的位置对字符串进行分割
6.6 re.finditer
类似findall 但是不会全部返回出来 而是返回迭代器(比如匹配成功了10万个 全部返回就很吃内存了)
import re text = "python is very easy" data = re.findall(r"\w+", text) print(data) # ['python', 'is', 'very', 'easy']
7. 常见正则
QQ号:[1 - 9][0 - 9]{4, }(腾讯QQ号从10000开始) 帐号(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 手机号码:^(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}$ Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$ 身份证号(15位、18位数字):^\d{15}|\d{18}$ 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$