什么是正则表达式
"""
正则表达式
本质上就是一个字符串
字符串有固定的规则,可以用字符串匹配验证这个规则
比如:判断身份证号,邮箱验证
1.如何使用正则
python中内置库提供一个模块,re
2.常见的内置函数
match() 从头开始匹配正则,如果匹配上则返回match对象,否则返回none,开头没有匹配到就返回none
findall() 根据正则匹配字符串中所有满足规则的匹配项,返回一个列表
search() 根据正则扫描整个字符串,找到第一个出现匹配项为止,返回match对象
split() 根据正则分割字符串,返回一个列表
sub() 根据正则完成字符串的替换
"""
re模块
python中提供了一个模块re(Regular Expression),专门支持正则表达式的处理 语法
| 函数名 | 作用 |
|---|---|
| match() | 从头开始匹配,匹配上返回match对象,如果开头没有匹配上则返回none |
| findall() | 根据匹配字符串中返回满足规则的匹配项,返回一个列表 |
| search() | 根据匹配字符串扫码整个字符串,找到第一个匹配项为止,返回match对象 |
| split() | 根据正则分割字符串,返回一个列表 |
| sub() | 根据正则完成字符串的替换 |
python
#导入re模块
import re
match()
python
print(re.match("abc","abcdefg")) #<re.Match object; span=(0, 3), match='abc'>
print(re.match("abc","defgabc")) #None
#匹配对象(Match Object)的方法
res = re.match("abc","abcdefg")
print(res)
print(f"匹配的内容为: {res.group()}") #abc
print(f"匹配的区间为: {res.span()}") #(0,3)
findall()
python
print(re.findall("abc","abcdaabcdefabcgabc"))
search()
python
print(re.search("abc","abcdaabcdefabcgabc"))
print(re.match("abc","daabcdefabcgabc"))
split()
python
print(re.split("abc","abcdaabcdefabcgabc"))
sub()
python
print(re.sub("abc","喜喜","abcdaabcdefabcgabc"))
正则基础字符
"""
1.匹配单个字符 --只匹配单个字符
规则:
. 匹配单个字符
\w 匹配单词字符 a-z/A-Z/0-9_
\W 匹配非单词字符 $,%
\d 数字字符
\D 非数字字符
\s 空白字符
\S 非空白字符
[内容] 匹配单个内容字符
2.数量词 --在单个字符的基础上加数量词
[X]* 0/多个
[X]+ 1/多个
[X]? 0/1
[X]{m} m个
[X]{m,} 至少匹配m个
[X]{m,n} m-n个
3.起止符
^以什么开头 $以什么结尾
4.分组
主要用于做筛选
()
5.面试题: 贪婪和非贪婪
贪婪: 在正则表达式中,匹配规则默认是尽可能多的去匹配
非贪婪:尽可能少的去匹配,关闭打开方式为数量词后加?
"""
匹配规则
python
#.
print(re.match(".","abc"))
print(re.match("..","#abc"))
#单词字符 \w a-z/A-Z/0-9_
print(re.match(r"[0-9]","7abc"))
print(re.match(r"\w","abc"))
print(re.match(r"\w","7abc"))
print(re.match(r"\w","Abc"))
print(re.match(r"\w","_abc"))
print(re.match(r"\w","$abc"))
#\W
print(re.match(r"\W","$abc"))
#\d \D
print(re.match(r"\d","abc"))
print(re.match(r"\d","1abc"))
print(re.match(r"\D","abc"))
#\s \S
print(re.match(r"\s"," abc"))
print(re.match(r"\S","abc"))
#案例: 测试网址 www.baidu.com
print(re.match("[w][w][w]","www.baidu.com"))
print(re.match("[0][2][9]","029-123424"))
print(re.match("[x|X]","X"))
数量词
python
#* + 匹配0个或者多个
print(re.match(r"\d*","abc")) #*返回的是一个空值
print(re.match(r"\d*","123abc"))
print(re.match(r"\d+","abc")) #+返回的是None
print(re.match(r"\d+","123abc"))
#? 匹配0个或者1个
print(re.match(r"\d?","abc")) #匹配不到也是返回空值
print(re.match(r"\d?","123abc"))
#案例:qq号
#{m,n} 匹配m到n次
print(re.match(r"\d{6,11}","3233198908"))
print(re.match(r"\d{6,11}","13415218045"))
print(re.match(r"\d{6,11}","44180220040927111X"))
#判断号码 029-12345678
print(re.match(r"\d*\W\d{8}","029-12345678"))
print(re.match(r"[029]{3}-\d{8}","029-12345678"))
#电话
print(re.match(r"\d{11}","13488818885"))
起止符
python
print(re.match(r"^lisi","lisi123lisi"))
print(re.match(r"^lisi","lilisi123lisi"))
print(re.findall(r"^lisi","lisi123lisi"))
print(re.findall(r"lisi$","lisi123lisi"))
print(re.findall(r"lisi$","lisi123lis2i"))
分组
python
res = re.match(r"^(www)(.+)(com|cn)$","www.baidu.com")
print(res)
print(res.groups())
print(res.group(0))
print(res.group(1))
print(res.group(2))
print(res.group(3))
#案例:判断某个人的身份证的出生年月日
res = re.match(r"\d{6}(\d{8})\d{3}[x|X]","44180220040927112X")
print(res)
print(res.groups())
print(res.group(1))
贪婪和非贪婪
python
res = re.match(r"(.*)(\d+-\d+-\d+)","this is numbers 123-456-780")
print(res)
print(res.groups())
res = re.match(r"(.*?)(\d+-\d+-\d+)","this is numbers 123-456-780")
print(res)
print(res.groups())
