1 正则表达式
- .:匹配任意单个字符
- x:匹配任意指定字符
- \:匹配一个反斜杠
- \n:匹配一个换行符
- \s:匹配空白的字符
- \d:匹配一个数字
- \D:匹配一个非数字
- \w:匹配一个字母或数字或下划线
- [abc]:匹配字母a、b、c
- [^abc]:匹配除字母a、b、c以外的任何字符
- [a-zA-Z]:匹配所有字母
- [0-9]:匹配所有数字
- [a-zA-Z_0-9]:匹配所有字母和下划线和数字
- ^[a-z]: ^代表行的开头,以字母开头
- [0-9]$:代表行的结尾,以数字结尾
- [abc]?:?匹配的是一个字母或者没有字母
- \d*:匹配多个数字或者没有数字
- \d+:+匹配多个数字
- \d{n}:匹配前一个字符连续n次
- \d{n,}:匹配前一个字符连续至少n次
- \d{n,m}:匹配前一个字符连续至少n次,最多m次
2 re模块
1 findall
- 匹配多个字符,返回列表
- 用法:re.findall(pattern,string)
Str = 'abc123def456ghi'
ret = re.findall(r'\d+', Str)
for data in ret:
print(data)
2 大小写不敏感设置
- 用法:re.xx(flags=re.IGNORECASE)
Str = 'AbC123DeF456GhJ'
ret = re.findall('[a-z]', Str, flags=re.IGNORECASE)
print(ret)
3 search
- 匹配从左到右的第一个字符
用法:re.search(pattern,string).group()
Str = 'abc123def456ghi'
ret = re.search(r'\D+', Str)
print(ret.group())
4 从头开始匹配
相当于search正则表达式中加上^
- 用法:re.match(pattern,string).group()
类似字符串的startswith
Str = 'abc123def456ghi'
ret = re.match('[a-z]+', Str)
print(ret.group())
print(ret.start())
print(ret.end())
5 切割字符
用法:re.split(pattern,string)
Str = 'abc123def456ghi'
ret = re.split(r'\d+', Str)
print(ret)
6 替换字符
用法:re.sub(pattern,replace,string,count)
Str = 'abc123def456ghi'
ret = re.sub(r'\d+', '|', Str)
print(ret)
7 替换字符并返回替换次数,返回元组
用法:re.subn(pattern,replace,string,count)
Str = 'abc123def456ghi'
ret = re.subn(r'\d+', '|', Str)
print(ret[0], ret[1])
8 编译式正则
优点:处理重复数据时节省时间
用法:re.compile(pattern)
Str = 'abc123def456ghi'
ret = re.subn(r'\d+', '|', Str)
print(ret[0], ret[1])
9 迭代器
优点:处理大量数据时节省空间与内存
用法:re.finditer(pattern,string)
Str = 'abc123def456ghi'
ret = re.finditer(r'\d+', Str)
for data in ret:
print(data.group())
10 非贪婪模式
使用通配符会尽量取最长满足字符串,加上?可取最短满足字符串
用法:?、*、+之后
Str = 'abc123def'
ret = re.search(r'abc\d+', Str)
ret2 = re.search(r'abc\d+?', Str)
print(ret.group())
print(ret2.group())
11 分组的使用
用法:(pattern) ```python Str = ‘https://www.baidu.com‘ ret = re.search(r’(\w+)://(\w+).(\w+).(\w+)’, Str) print(ret.group()) print(ret.group(1)) print(ret.group(2)) print(ret.group(3)) print(ret.group(4))
Str = ‘https://www.baidu.com‘ ret = re.findall(r’(\w+)’, Str) print(ret)
<a name="mdqfe"></a>
## 12 分组命名
- 用法:(?<name>Ppattern)
```python
Str = '123//123'
ret = re.search(r'(?P<con>\w+)//(?P=con)', Str)
print(ret.group())
3 实战
1 取标签中文本内容
Str = r"""
岗位职责:
完成推荐算法、数据统计、接口、后台等服务器端相关工作
必备要求:
良好的自我驱动力和职业素养,工作积极主动、结果导向
技术要求:
1、一年以上 Python 开发经验,掌握面向对象分析和设计,了解设计模式
2、掌握HTTP协议,熟悉MVC、MVVM等概念以及相关WEB开发框架
3、掌握关系数据库开发设计,掌握 SQL,熟练使用 MySQL/PostgreSQL 中的一种
4、掌握NoSQL、MQ,熟练使用对应技术解决方案
5、熟悉 Javascript/CSS/HTML5,JQuery、React、Vue.js
加分项:
大数据,数理统计,机器学习,sklearn,高性能,大并发。"""
1 显示所有符合文本,贪婪模式下取最长的<匹配字符
ret = re.findall('>.*<', Str)
print(ret)
2 显示所有符合文本,非贪婪模式
ret = re.findall('>.*?<', Str)
print(ret)
3 只显示括号内的文本
ret2 = re.findall('>(.*?)<', Str)
print(ret2)
2 取各网址的域名
Str = """https://blog.csdn.net/
https://www.baidu.com/s?wd=123
https://www.yuque.com/weicreate/base
https://www.sogou.com/web?query=321"""
ret = re.findall(r'https://(.*?)/', Str)
print(ret)
3 将邮箱格式分离并替换成自己的邮箱地址
Str = """1243007569@qq.com, weicreate@163.com, whp@sina.com
whp123@139.com, whp123@134.com
wuhao321@123.com"""
ret = re.compile(r'[^,\n].?@?.com')
res = ret.findall(Str)
res2 = ret.sub('weicreate@qq.com', Str)
print(res)
print(res2)