前言
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.findall('9(\d)\d','194445556sdfssd2942dsa')
print(r)
ret = re.search('9\d(\d)','194745556sdfssd2942dsa')
print(ret) # 变量
if ret: #如果正则表达式未匹配到结果 会报错,所以使用if判断一下
print(ret.group()) # 取到194445556这个值
print(ret.group(1))
# 为什么要用分组,以及findall的分组优先到底有什么好处?
exp = '2-3*(5+6)'
# 获取a+b或者是a-b 并且计算他们的结果
r = re.search('(\d+)[+](\d+)',exp)
print(r)
print(r.group(1))
print(r.group(2))
print(int(r.group(1))+int(r.group(2)))
c = re.findall('AA(.*?)CC', 'AAbbbCC')
print(c)
三、json信息提取库
常用模块:jsonpath
1、作用:对json文本信息进行提取
2、什么是json?
json类似字典,不是字典
json是结构类似于字典的字符串
3、jsonpath常见的特殊符合
$ 根节点
.. 选择所有符合条件(模糊匹配)
* 匹配所有元素节点
@ 现行节点
. 取子节点
代码示例:
import jsonpath
data = {
'error_code': 0,
"stu_info":
[{'id': 23, 'name': 'zhangs', 'sex': '男'},{'id': 24, 'name': 'lsi', 'sex': '女'}]
}
# $ 模糊匹配,表示json最外层,直接拿到key为name的值
data_a = jsonpath.jsonpath(data, '$..name')
print('模糊匹配:', data_a)
# 精确匹配,取到error_code的值
data_j = jsonpath.jsonpath(data, '$.error_code')
print('精确匹配:', data_j)
# 精确匹配,获取stu_info里第一个值的第一个name
data_v = jsonpath.jsonpath(data, '$.stu_info[0].name')
print('stu_info第一个学员信息:', data_v)
总结
以上就是文章要表达的内容,本文介绍了Python中正则表达式的构建方式,以及使用jsonpath来提取json格式数据。