淘先锋技术网

首页 1 2 3 4 5 6 7


前言

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格式数据。