Python3(七) 正则表达式与JSON
一. 初识正则表达式
1.定义:是一个特殊的字符序列,可以帮助检测一个字符串是否与我们所设定的字符序列相匹配。
2.作用:可以实现快速检索文本、实现替换文本的操作。
3.场景:
1、检测一串数字是否是电话号码
2、检测一个字符串是否符合e-mail格式
3、把一个文本里指定的单词替换为另外一个单词
4.例子:
查看传入的字符串是否还有Python
(1)
a = 'C|C++|Java|Python'
print(a.index('Python') > -1)
或者
print('Python' in a)
(2)
用正则表达式处理:
import re
a = 'C|C++|Java|Python'
r = re.findall('Python',a)
if len(r) > 0:
print('字符串中包含Python')
else:
print('No')
5.语法



二. 元字符与普通字符
1.‘Python’普通字符,'\d'元字符。正则表达式就是由一系列普通字符和元字符组成的。
2.例子:
提取字符串中所有的数字:\d :表示所有数字
import re
a = 'C2C++4Java7Python6'
r = re.findall('\d',a)
print(r)
#结果:
['', '', '', '']
提取字符串中所有的非数字:
import re
a = 'C2C++4Java7Python6'
r = re.findall('\D',a) #\D为非数字
print(r)
三.字符集
例子:
1.中间一个字符是c或者f的单词:[ ]:字符集,或关系
普通字符定界,确定某一个小段。该例子中a[cf]c,中括号外面的a和c就是普通字符定界
import re
s = 'abc,acc,adc,aec,afc,ahc'
r = re.findall('a[cf]c',s)
print(r)
#结果:
['acc', 'afc']
2.中间一个字符不是c或者f的单词:^:取反操作
import re
s = 'abc,acc,adc,aec,afc,ahc'
r = re.findall('a[^cf]c',s)
print(r)
#结果:
['abc', 'adc', 'aec', 'ahc']
3.利用字符顺序省略字符,匹配c,d,e,f:- :省略中间字符
import re
s = 'abc,acc,adc,aec,afc,ahc'
r = re.findall('a[c-f]c',s)
print(r)
#结果:
['acc','adc','aec','afc']
四. 概括字符集
1.\d可以用[0-9]表示:
import re
a = 'python1111java678php'
r = re.findall('[0-9]',a)
print(r)
2.\w匹配所有的数字和字符:
\w只能匹配单词字符,也就是[A-Za-z0-9_]
\W只匹配非单词字符,如空格、&、\n、\r、\t等都为非单词字符
import re
a = 'python1111&java___678php'
r = re.findall('\w',a)
print(r
结果:

3.\s代表空白字符:空格、\n、\r等
\S代表非空白字符
mport re
a = 'python1111&_java678 \nph\rp'
r = re.findall('\s',a)
print(r)
#[' ', ' ', '\n', '\r']
常用的概括字符集:\d \D \w \W \s \S
. 匹配除换行符\n之外的其他所有字符
五.数量词
1.匹配三个字母的单词:
import re
a = 'python1111 java678php'
r = re.findall('[a-z]{3}',a)
print(r)
#['pyt', 'hon', 'jav', 'php']
2.匹配完整的单词:
import re
a = 'python1111 java678php'
r = re.findall('[a-z]{3,6}',a)
print(r)
#['python', 'java', 'php']
利用数量词{数量}多次重复
六. 贪婪与非贪婪
数量词有贪婪和非贪婪之分,一般来说Python倾向于贪婪的匹配方式。
1.{数量} ?变成非贪婪模式
2.例子:
import re
a = 'python1111 java678php'
r = re.findall('[a-z]{3,6}?',a)
print(r)
#['pyt', 'hon', 'jav', 'php']
七. 匹配0次1次或者无限多次
1.用 * 对它前面的字符匹配0次或者无限多次:
import re
a = 'pytho0python1pythonn2'
r = re.findall('python*',a)
print(r)
#['pytho', 'python', 'pythonn']
2.用+匹配一次或者无限多次:
import re
a = 'pytho0python1pythonn2'
r = re.findall('python+',a)
print(r)
#['python', 'pythonn']
3.用?匹配0次或者一次:
import re
a = 'pytho0python1pythonn2'
r = re.findall('python?',a)
print(r)
#['pytho', 'python', 'python']
注意:多出来的n会被去掉,因为读到python时就满足了
用?来进行去重复的操作。
贪婪与非贪婪中的{3,6}?和 python? 时的问号用法不一样。
八. 边界匹配
例子:
QQ号的位数是否符合4-8位:
import re
qq = ''
r = re.findall('^\d{4,8}$',qq)
print(r)
#[]
^ $ 组成边界匹配符
^ 从字符串开头开始匹配
$ 从字符串末尾开始匹配
000$ 最后三位是000
^000 开始三位是000
九. 组
1.例子:
python字符串是否重复出现三次:
import re
a = 'pythonpythonpythonpythonpython'
r = re.findall('(python){3}',a)
print(r)
2.
一个括号对应一组。
[]里的字符是或关系
()里的字符是且关系
十. 匹配模式参数
1.例子:
忽略大小写:
import re
a = 'pythonC#\nJavaPHP'
r = re.findall('c#.{1}',a,re.I|re.S)
print(r)
#['c#\n']
2.
re.I:忽略大小写,多个模式之间用|,这里的|是且的关系
re.S:匹配包括\n在内的任意字符
十一. re.sub正则替换

0:把所有匹配的都替换,1:只有第一个匹配到的被替换
1.例子:
(1)查找并替换:
import re
a = 'PythonC#JavaPHP'
r = re.sub('C#','GO',a)
print(r)
#PythonGOJavaPHP
import re
a = 'PythonC#\nJavaPHP'
r = re.sub('C#','GO',a,0) #0:把所有的C#换成GO,1:只有第一个匹配到的被替换成GO
print(r)
#PythonGO
#JavaPHP
(2)常规替换可以使用replace函数:
import re
a = 'PythonC#\nJavaPHP'
a = a.replace('C#','GO') #是sub的简化版
print(a)
(3)sub强大的地方在于其第二个参数可以是一个函数:


import re
def convert(value):
matched = value.group() #从对象中提取字符串
return '!!' + matched + '!!'
a = 'PythonC#JavaPHP'
r = re.sub('C#',convert,a)
print(r)
#Python!!C#!!JavaPHP
sub匹配到第一个结果会传到convert函数中去,返回的结果是新的字符串用来替换匹配到的词。
十二.把函数作为参数传递
例子:
找出数字,大于等于6的替换成9,小于6的替换成0:
import re
def convert(value):
matched = value.group()
if int(matched) >= 6:
return ''
else:
return ''
s = 'A8C3721D86'
r = re.sub('\d',convert,s)
print(r)
#A9C0900D99
十三.search与match函数
1.
match:从字符串开始的地方开始匹配(首字母开始匹配)。
search:搜索整个字符串,直到找到第一个满足的结果并返回。
match和search返回的是对象,且只匹配一次,不会像findall一样匹配所有。
2
import re
s = 'A8C3721D86'
r = re.match('\d',s)
print(r)
r1 = re.search('\d',s)
print(r1)
#None
#<re.Match object; span=(1, 2), match='8'>
3.

小结:
r.span()返回位置,(第一个数字表示找到的该数字的前一个位置,第二个数字表示找到的该数字的位置)
r.group()返回字符串
十四. group分组
1.提取life和python之间的字符:
import re
s = 'life is short,i use python'
r = re.search('life(.*)python',s)
print(r.group(1))
#is short,i use
group(0)是完整匹配结果
group(1)是完整匹配结果的内部分组
(2)
用findall做:
import re
s = 'life is short,i use python'
r = re.findall('life(.*)python',s)
print(r)
#['is short,i use']
2.group(1)是第一个分组,group(2)是第二个分组:
import re
s = 'life is short,i use python,i love python'
r = re.search('life(.*)python(.*)python',s)
print(r.group(0))
print(r.group(1))
print(r.group(2))
#life is short,i use python,i love python
#is short,i use
#,i love
3.r.groups()返回除完整以外的结果:
import re
s = 'life is short,i use python,i love python'
r = re.search('life(.*)python(.*)python',s)
print(r.groups())
#(' is short,i use ', ',i love ')
总结:
一些关于学习正则的建议
python绝大多数用在爬虫上,需要用到正则表达式
搜索 '常用正则表达式' 并加以分析
一. 理解JSON
1.JavaScript Object Notation, 是一种轻量级(与XML比)的数据交换格式。
2.字符串是JSON的表现形式,符合JSON格式的字符串就是JSON字符串。
3.优势:
- 易于阅读
- 易于解析
- 网络传输效率高
适合做跨语言交换数据
4.

二. 反序列化:字符串到语言的数据结构的过程
json内用双引号,则外部用单引号表示字符串
1.利用python内部的json解析JSON数据:
import json
json_str = '{"name":"tai","age":23}' #json内用双引号,则外部用单引号表示str
student = json.loads(json_str)
print(type(student))
print(student)
print(student['name'])
print(student['age'])
#<class 'dict'> #解析出来是字典
#{'name': 'tai', 'age': 23}
#tai
#
同样的JSON字符串,不同的语言会装换成不同的类型。其中对应到Python中是字典类型。
2.解析JSON数组:
import json
json_str = '[{"name":"tai","age":23,"flag":false},{"name":"tai","age":23}]'
student=json.loads(json_str)
print(type(student))
print(student)
#<class 'list'> #数组转成了列表
#[{'name': 'tai', 'age': 23, 'flag': False}, {'name': 'tai', 'age': 23}] #列表中两个元素,每个元素是一个字典
字符串->语言下某一数据结构的过程:反序列化
总结:json到Python对应的数据转换类型

三.序列化
1. 序列化:字典到字符串
import json student = [
{"name":"tai","age":23,"flag":False},
{"name":"tai","age":23}
] json_str = json.dumps(student) print(type(json_str)) print(json_str) #<class 'str'> #[{"name": "tai", "age": 23, "flag": false}, {"name": "tai", "age": 23}]
四.小谈JSON、JSON对象与JSON字符串
JSON某种程度上是与Javascript平级的语言。
JSON对象、JSON、JSON字符串。
A语言数据类型 —JSON(中间数据类型)—> B语言数据类型
JSON有自己的数据类型,虽然和Javascript的数据类型差不多。
REST服务的标准格式,使用JSON。
Python3(七) 正则表达式与JSON的更多相关文章
- Java基础七-正则表达式
Java基础七-正则表达式 一.定义: 特定的符号的组合 二.作用: 用于操作字符串数据 三.优缺点 简化代码,但是阅读性差 四.引入 4.1 问题 判断一个号码是否是QQ号? 不是零开头 6-15位 ...
- python3字典:获取json响应值来进行断言的用法详解
在Python中我们做接口经常用到一些json的返回值我们常把他转化为字典,在前面的python数据类型详解(全面)中已经谈到对字典的的一些操作,今天我们就获取json返回值之后,然后转化为字典后的获 ...
- Python(八) 正则表达式与JSON
一.初识正则表达式 正则表达式 是一个特殊的字符序列,一个字符串是否与我们所设定的这样的字符序列,相匹配 快速检索文本.实现替换文本的操作 json(xml) 轻量级 web 数据交换格式 impor ...
- python3.5 正则表达式
我们平时上网的时候,经常需要在一些网站上注册帐号,而注册帐号的时候对帐号名称会有一些要求. 比如: 上面的图片中,输入的邮件地址.密码.手机号 才可以注册成功. 我们需要匹配用户输入的内容,判断用户输 ...
- C# 正则表达式、Json
正则表达式: 正则表达式主要的参考文章:http://www.cnblogs.com/stg609/archive/2009/06/03/1492709.html#anchorD. 需求:将cocos ...
- python小练--使用正则表达式将json解析成dict
练习python语法,自己实现了一个简单的解析json字符,存为dict字典对象. { "id":12, "name":"jack", &q ...
- 深入理解ajax系列第七篇——传递JSON
前面的话 虽然ajax全称是asynchronous javascript and XML.但目前使用ajax技术时,传递JSON已经成为事实上的标准.因为相较于XML而言,JSON简单且方便.本文将 ...
- Python的正则表达式与JSON
Python的正则表达式需要导入re模块 菜鸟教程:http://www.runoob.com/python/python-reg-expressions.html 官方文档:https://docs ...
- jmeter通过json extrcator或者正则表达式获取json返回信息
1.下载地址,及插件文档资料 https://jmeter-plugins.org/wiki/JSONPathExtractor/ json信息如下 { "error_code": ...
随机推荐
- vs删除空白行 注释
在vs编辑器中有时需要批量删除无用的空白行,为此,可以使用vs编辑器的查找替换功能: 1. Ctrl+H,打开替换功能框. 2.选择“使用正则表达式”,“当前文档”. 3.在查找框中输入: (?< ...
- Spring学习记录6——ThreadLocal简介
Spring通过各种模板类降低了开发者使用各种数据持久化技术的难度.这些模板类是线程安全的,所以 多个DAO可以复用同一个模板实例而不会发生冲突.在使用模板类访问底层数据时,模板类需要绑定数据连接或者 ...
- SpringMVC启动流程源码解密
我们知道,SpringMVC最后是通过Tomcat来进行部署的.当在Servlet中进行进行应用部署时,主要步骤为(引用来自http://download.oracle.com/otn-pub/jcp ...
- 在winform中使用cefsharp.winform嵌入浏览器(含视频教程)
免费视频教程和源码: https://www.bilibili.com/video/av84573813/ 1. 开始使用CefSharp在Winform中嵌入网页 2. 解决重复打开Cefsharp ...
- noip2018 考前提醒!
适应Noilinux 1.终端操作 打开终端 \(Ctrl+Alt+T\) 打开文件夹 \(cd\) +名称 新建文件夹 \(mkdir\) +名称 打开 \(vim\) 配置 \(vim ~/.vi ...
- [bzoj1070] [洛谷P2053] [SCOI2007] 修车
Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序, ...
- 04-String
动手动脑 请运行以下示例代码StringPool.java,查看其输出结果.如何解释这样的输出结果?从中你能总结出什么? s0,s1,s2字符串的内容相同,实际占用的是同一空间,引用的是同一个对象,所 ...
- 玩转Django2.0---Django笔记建站基础九(二)(Auth认证系统)
9.4 设置用户权限 用户权限主要是对不同的用户设置不同的功能使用权限,而每个功能主要以模型来划分.以9.3节的MyDjango项目为例,在Admin后台管理系统可以查看并设置用户权限,如下图: 用户 ...
- springBoot 整合 dubbo 遇到的坑
一.注意springBoot 和 dubbo 之间版本的问题 <?xml version="1.0" encoding="UTF-8"?> < ...
- ShiroINI配置及加密(三)
Shiro InI 配置 ini语法: 1.对象名 = 全限定类名 相对于调用 public 无参构造器创建对象 2.对象名. 属性名 = 值 相当于调用 setter 方法设置常量值 3.对象名. ...