1、简单定义
正则表达式就是使用一些抽象出来用来代表某类字符的特定字符组成的字符串。
正则表达式是用来在大量字符中匹配(寻找)符合自身字符规则的字符串。
正则表达式是一种规则(人为定义的用某些字符表示一类字符的规则)。
正则表达式是对字符串操作的一种逻辑公式。
2、作用和特点
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
- 给定的字符串是否符合正则表达式的过滤逻辑(称作’匹配’)。
- 可以通过正则表达式,从字符串中获取我们想要的特定部分 。
正则表达式的特点是:
- 灵活性、逻辑性和功能性非常强。
- 可以迅速地用极简单地方式达到字符串地复杂控制。
- 对于刚接触地人来说,比较晦涩难懂 。
3、应用场景
- 如何判断一个字符串是手机号呢?
- 判断邮箱为163或者126的所有邮件地址。
- 假如你在写一个爬虫,你得到了一个网页的HTML源码,其中有一些你需要过滤。
…
4、re模块
import re
msg = 'jasontomjerrytomy'
pattern = re.compile('tom')
result = pattern.match(msg) #从头开始匹配
print(result) #没有匹配
#使用re正则re模块方法:match
result = re.match('tom',msg) #等效于上面的代码,只要从开头进行匹配,如果匹配不成功则返回None
result = re.search('tom',msg)
print(result)
print(result.span()) #返回位置
print(result.group()) #使用group提取到匹配的内容
# print(result.groups(''))
#[] 表示的是一个范围
#提取a2b,t7g这种格式的字符串呢?字母+数字+字母
msg = 'reefemgmp2tt43t09jdgg8nkd5s'
result = re.search('[a-z][0-9][a-z]',msg) #找到一个就返回
print(result.group())
result = re.findall('[a-z][0-9][a-z]',msg) #findall 匹配整个字符串,找到一个继续向下找一直到字符串结尾
print(result)
# ‘*’用于将前面的模式匹配0次或多次(贪婪模式,尽可能多的匹配) >=0
# '+' 用于将前面的模式匹配1次或多次(贪婪模式)
# ‘?’用于将前面的模式匹配0次或1次(贪婪模式) 0,1
# qq号码验证 5-11位 开头不能是0 正则验证的永远是字符串
# ^开头,$结尾
# {m} 用于验证前面的模式匹配m次
# {m,} 用于验证将前面的模式匹配m次或者多次 >=m
#{m,n} 用于验证将前面的模式匹配大于等于m次并且小于等于n次
qq = '4646484164'
result = re.match('^[1-9][0-9]{4,10}$',qq)
print(result)
#用户名可以是字母或者数字,不能是数字开头,用户名长度必须6位以上[0-9a-zA-Z]
username = 'admin001'
result = re.match('^[a-zA-Z][0-9a-zA-Z]{5,}$',username)
print(result)
msg = 'aa.py ab.txt bb.py kk.png uu.py apuj.txt'
result = re.findall(r'\w\.py\b',msg)
print(result)
#分组 | 或者
#匹配数字0-100数字
n = '39'
result = re.match('100$|[1-9]?[0-9]$',n)
print(result)
#(word | word |word) 区别 [abc]表示的是一个字母而不是一个单词
#验证输入的邮箱 163 126 qq
email = '318795954@qq.com'
result = re.match(r'\w{5,20}@(163|126|qq)\.(com|cn)',email)
print(result)
#不是以4、7结尾的手机号码(11位)
phone = '13676581035'
result = re.match(r'1\d{9}[0-35-689]$',phone)
print(result)
#爬虫
phone = '010-12345678'
result = re.match(r'(\d{3}|\d{4})-(\d{8})',phone)
print(result)
#分别提取(分组)
print(result.group())
#()表示分组 group(1)表示提取到第一组的内容 group(2)表示第二组的内容
print(result.group(1))
print(result.group(2))
msg = '<html>abc</html>'
msg1 = '<h1>hello</h1>'
result = re.match(r'<[0-9a-zA-Z]+>(.+)</[0-9a-zA-Z]+>$',msg)
#也可以这么写 result = re.match(r'<([0-9a-zA-Z]+)>(.+)</\1>$',msg) 通过数字分组引用
print(result)
print(result.group(1))
#正则表达式其他函数
#起名的方式:(?P<名字>正则> (? P=名字))
msg = '<html><h1>abc</h1></html>'
result = re.match(r'<(?P<name1>\w+)><(?P<name2>\w+)>(.+)</(?P=name2)></(?P=name1)>',msg)
print(result)
print(result.group(1))
print(result.group(2))
'''
分组:() ---> result.group(1) 获取组中的匹配内容
引用分组匹配内容:
1.number \number 引用第number组的数据
2.?P<名字>
re 模块
match
serach
findall
sub(正则表达式,'新内容',string) 替换
split(r'[]')
'''
result = re.sub(r'\d+','90','java:99 python:95')
print(result)
result = re.split(r'[,:]','java:99,python:95') #妙啊 在字符串中搜索如果遇到:或者,就分割 将分割内容保存到列表中
print(result)
总结:
常用符号:
. | 任意字符除(\n) |
---|---|
^ | 开头 |
$ | 结尾 |
[] | 范围 |
正则预定义:
\s | 空白(空格) |
---|---|
\b | 边界 |
\d | 数字 |
\D | 非数字 |
\w | word [0-9a-zA-Z] |
\W | not word |
大写反写 | \S 非空格 \D 非数字 … |
量词:
* | >=0 |
---|---|
+ | >=1 |
? | 0,1 |
{m} | 用于验证前面的模式匹配m次 |
{m,} | 用于验证将前面的模式匹配m次或者多次 >=m |
{m,n} | 用于验证将前面的模式匹配大于等于m次并且小于等于n次 |
分组:
- \number 引用第number组的数据
- ?P<名字>
5、贪婪与非贪婪模式
Python里数量词默认是贪婪的(在少数语言中也可能默认是非贪婪的),总是尝试匹配尽可能多的字符。
非贪婪则相反,总是尝试匹配尽可能少的字符。
在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪。