文章目录
- 一、优缺点
- 一、函数
- 1、re.match
- 2、re.search
- 3、re.findall
- 4、re.sub、re.subn
- 5、re.split
- 6、re.compile
- 7、re.group
- 二、flags修饰符
- 三、正则表达式模式
- 3.1.正则表达式模式实例:
正则表达式是一个特殊的字符序列,它能检查一个字符串是否与某种模式匹配。
一、优缺点
1、正则表达式在项目中的应用场景?
(1) 验证数据的有效性。例如验证邮箱或者密码是否符合格式。
(2) 替换文本内容。
(3) 从字符串中提取子字符串。
2、 正则表达式的弊端是什么?
(1) 使代码难以阅读
(2) 容易引起性能问题。像.*这种贪婪匹配符号很容易造成大量的回溯,性能大幅下降。
(3) 正则的替换功能较差。甚至没有基本的截取字符串或者把首字母改变大小写的功能,这对于url重写引擎有时候是致命的影响
(4) 正则表达式只适合匹配文本字面,不适合匹配文本意义。
一、函数
import re 模块
1、re.match
从字符串的起始位置匹配,否则返回None。
match和search均匹配一个。
re.match(pattern, string, flags=0)
re.match('www', 'www.runoob.com') # <_sre.SRE_Match object; span=(0, 3), match='www'>
re.match('www', 'www.runoob.com').span() # (0, 3) 输出匹配到的位置
re.match('www', 'www.runoob.com').group() # ’www’ 输出匹配到的第一个值
re.match('com', 'www.runoob.com') # None
2、re.search
返回第一个成功的匹配,否则返回None。
re.search(pattern, string, flags=0)
re.search('com', 'www.runoob.com').span() # (11, 14)
3、re.findall
扫描整个文本,返回所有与规则匹配的子串组成的列表,如果没有匹配的返回空列表
re.findall(pattern, string, flags=0)
pattern = "python"
string = "I love python language.I also use python to build applicants at work!"
re.findall(pattern, string, re.I) # >> ['python', 'python']
4、re.sub、re.subn
将pattern替换为repl,count替换的最大次数,0表示替换所有
re.sub(pattern, repl, string, count=0, flags=0)
phone = "2004-959-559 # 这是一个国外电话号码"
num = re.sub(r'\D', "", phone) # 2004959559 替换非数字
re.subn(pattern, repl, string, count=0, flags=0) # 输出替换了多少次,返回一个元祖
# >>('204959559', 2)
5、re.split
用匹配到的值做为分割点,把值分割成列表
re.split(pattern, string, maxsplit=0, flags=0)
string = 'Python is an excellent language'
re.split(" ",string) # >> ['Python', 'is', 'an', 'excellent', 'language']
6、re.compile
那么如果一个正则表达式要重复使用几千次,出于效率的考虑,我们是不是应该先把这个正则先预编译好,接下来重复使用时就不再需要编译这个步骤了,直接匹配,提高我们的效率
re.compile(pattern[, flags]) # 编译正则表达式,生成一个正则表达式对象,供match()和search()这两个函数使用。
7、re.group
用于查看指定分组匹配到的内容,匹配对象函数来获取匹配表达式
.group() # 整个匹配
.groups()
.group(num) # 返回一个元祖中的
str = 'i can speak good english'
matchstr = re.match(r'(\w*)\s(\w*)\s(\w*)\s(\w*).*',str)
matchstr = matchstr.group()
print(matchstr) >>’i can speak good english’
matchstr = matchstr.groups() >>('i', 'can', 'speak', 'good')
matchstr = matchstr.group(1) >> ‘i’
matchstr = matchstr.group(2) >> ‘can’
matchstr = matchstr.group(3) >> ‘speak’
matchstr = matchstr.group(4) >> ‘good’
matchstr = matchstr.group(5) >> 报错:IndexError: no such group
二、flags修饰符
re.I | 忽略大小写 |
re.L | 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境 |
re.M | 多行模式 |
re.S | 即为 . 并且包括换行符在内的任意字符(. 不包括换行符) |
re.U | 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库 |
re.X | 为了增加可读性,忽略空格和 # 后面的注释 |
str="runoobgoogle\ntaobao\nrunoobweibo"
re.match(r’runoob’,str,re.M) # 表示不止匹配一行
三、正则表达式模式
^ | 开头 | str = ‘ef1qf3qfgwr’, pattern = ‘^fg’, print(re.search(pattern, str).group()) >>报错,查不到 |
$ | 结尾 | |
. | 任意字符,除了换行符\n | |
\ | 转义字符 | |
[…] | 一组字符。[amk]匹配其中任一个 | rub[ye] 匹配 “ruby” 或 “rube” |
[^…] | 不在[]中的字符 | [^aeiou] 除了aeiou字母以外的所有字符 |
限定符
re* | 0个或多个 | |
re+ | 1个或多个 | |
re? | 0个或1个 | |
re{n} | 精确n个 | |
re{n,} | n+个 | |
re{n,m} | n到m个,包括m | |
a|b | a或b | |
(re) | 对正则表达式分组并记住匹配的文本。用group方法查找到。 | |
(?imx) | 只能选择i、m、x中的任一个 | |
\w | 字母、数字、下划线 =[A-Za-z0-9_] | |
\W | 非 | |
\s | 空白字符,包括换行符\n =[ \t\n\r\f\v] | |
\S | 非 | |
\d | 数字 =[0-9] | |
\D | 非 =[^0-9] | |
\A | 字符串开始 | |
\Z | 字符串结束,只匹配到换行前 | |
\z | 字符串结束 | |
\G | ||
\b | ||
\B | ||
\n, \t, 等 | 换行符、制表符 | |
\1…\9 | 匹配第n个分组的内容 | |
\10 |
举例:
^[0-9]+abc$ 开头是数字,结尾是abc的
^bucket$ ^$同时使用表示精确匹配
3.1.正则表达式模式实例:
[0-9] 任意数字
[a-z] 任意小写字母
[A-Z] 大写
[a-zA-Z0-9] 字母及数字
邮箱
手机号 ^(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}$ # 13、14、15、18开头
国内电话号码(0511-4405222、021-87888822): \d{3}-\d{8}|\d{4}-\d{7}
身份证(15位、18位数字): ^\d{15}|\d{18}$
日期格式(2022-8-16): ^\d{4}-\d{1,2}-\d{1,2}
IP地址: \d+\.\d+\.\d+\.\d+ (提取IP地址时有用)
密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线): [a-zA-Z]\w{5,17}$