前言
Python系列文章主要是记录自己学习成果及知识输出整合,提供一个温故而知新的场所。
一、正则表达式
1、什么是正则表达式
一套规则 - 匹配字符串的,处理文本,提取信息
2、能做什么?
检测一个输入的字符串是否合法 -- web开发项目 表单验证
用户输入一个内容的时候,我们要提前做检测
能够提高程序的效率并且减轻服务器的压力
从一个大文件中找到所有符合规则的内容 -- 日志分析\爬虫
能够高效的从一大段文字中快速找到符合规则的内容
二、正则表达式如何写
1.正则表达式验证工具
https://regex101.com/,一般使用这个网址进行验证,正则表达式是否正确
2.正则表达式=普通字符+特殊字符
普通字符:可以是需要匹配的任意字符,直接匹配
特殊字符:有特殊函数
常见特殊符号
. 匹配除换行符之后的任意单个字符
* 匹配前面的子表达式任意次(包括0次)
+ 匹配前面的子表达式任一次或多次
{n} 表示匹配n次
{n,} 表示匹配至少n次
{m,n} 匹配m~n次
? 尽可能少的去匹配
\ 进行转义,如果需要匹配一些特殊字符,就需要用到\进行转义
\d 匹配0-9之间任意字符 [0-9]
\D 匹配不是0-9之间任意字符 [^0-9]
\s 匹配任意一个空白字符 包括空格 换行符 tab
\S 匹配任意不是一个空白字符
\w 匹配任意一个文字字符 包括字母 数字 下划线
\W 匹配任意一个不是文字字符
[] 是匹配几个字符之一
^ 表示文本的开头位置 非
$ 表示文本的结尾位置
() 表示分组,也就是只保留括号里面的值进行输出
3.贪婪匹配和非贪婪匹配
贪婪匹配
在量词范围允许的情况下,尽量多的匹配内容
.*x 表示匹配任意字符 任意多次数 遇到最后一个x才停下来
非贪婪(惰性匹配)匹配
在量词范围允许的情况下,尽量少的匹配内容
元字符 量词 ?
.*?x 表示匹配任意字符 任意多次数 但是一旦遇到x就停下来
4.分组与两个函数的关系
findall 还是按照完整的正则进行匹配,总是只显示括号里匹配到的内容(取所有符合条件的,优先显示分组中的)。
search (只取第一个符合条件的)还是按照完整的正则进行匹配,显示也是显示匹配到的第一个内容,但是我们可以通过给group方法传参数,来获取具体分组中的内容。
search 得到的结果是一个变量
变量.group() 的结果完全和变量.group(0) 的结果完全一致
变量.group(n) 的形式来指定获取第n个分组中匹配到的内容
为什么在search中不需要分组优先 而在findall中需要?
加上括号是为了对真正需要的内容进行提取
re = re.findall('<\w+>(\w+)<\w+>',<h1>asdha124728fysdjf24</h1>)
print(re)
以下为re模块正则表达式的一些示例代码:
import re
r = re