一. 初识正则表达式

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的更多相关文章

  1. Java基础七-正则表达式

    Java基础七-正则表达式 一.定义: 特定的符号的组合 二.作用: 用于操作字符串数据 三.优缺点 简化代码,但是阅读性差 四.引入 4.1 问题 判断一个号码是否是QQ号? 不是零开头 6-15位 ...

  2. python3字典:获取json响应值来进行断言的用法详解

    在Python中我们做接口经常用到一些json的返回值我们常把他转化为字典,在前面的python数据类型详解(全面)中已经谈到对字典的的一些操作,今天我们就获取json返回值之后,然后转化为字典后的获 ...

  3. Python(八) 正则表达式与JSON

    一.初识正则表达式 正则表达式 是一个特殊的字符序列,一个字符串是否与我们所设定的这样的字符序列,相匹配 快速检索文本.实现替换文本的操作 json(xml) 轻量级 web 数据交换格式 impor ...

  4. python3.5 正则表达式

    我们平时上网的时候,经常需要在一些网站上注册帐号,而注册帐号的时候对帐号名称会有一些要求. 比如: 上面的图片中,输入的邮件地址.密码.手机号 才可以注册成功. 我们需要匹配用户输入的内容,判断用户输 ...

  5. C# 正则表达式、Json

    正则表达式: 正则表达式主要的参考文章:http://www.cnblogs.com/stg609/archive/2009/06/03/1492709.html#anchorD. 需求:将cocos ...

  6. python小练--使用正则表达式将json解析成dict

    练习python语法,自己实现了一个简单的解析json字符,存为dict字典对象. { "id":12, "name":"jack", &q ...

  7. 深入理解ajax系列第七篇——传递JSON

    前面的话 虽然ajax全称是asynchronous javascript and XML.但目前使用ajax技术时,传递JSON已经成为事实上的标准.因为相较于XML而言,JSON简单且方便.本文将 ...

  8. Python的正则表达式与JSON

    Python的正则表达式需要导入re模块 菜鸟教程:http://www.runoob.com/python/python-reg-expressions.html 官方文档:https://docs ...

  9. jmeter通过json extrcator或者正则表达式获取json返回信息

    1.下载地址,及插件文档资料 https://jmeter-plugins.org/wiki/JSONPathExtractor/ json信息如下 { "error_code": ...

随机推荐

  1. MySQL快速回顾:高级查询操作

    8.1 排序数据 检索出的数据并不是以纯粹的随机顺序显示的.如果不排序,数据一般将以它在底层表中出现的顺序显示.这可以是数据最初添加到表中的顺序.但是,如果数据后来进行过更新或删除,则此顺序将会受到M ...

  2. 那些不懂hystrix的秘密

    一 前言 springcloud系列文章已经出到hystrix,中间知识追寻者跑去学了其它知识,回来感觉spingcloud系列出的也不少了:需要完全理解这篇文章对于初学者需要有一定的基础知识,如果看 ...

  3. 《深入浅出话数据结构》系列之什么是B树、B+树?为什么二叉查找树不行?

    本文将为大家介绍B树和B+树,首先介绍了B树的应用场景,为什么需要B树:然后介绍了B树的查询和插入过程:最后谈了B+树针对B树的改进. 在谈B树之前,先说一下B树所针对的应用场景.那么B树是用来做什么 ...

  4. FileUpload的控件上传excel

    在一个使用FileUpload的控件上传excel,读取excel的数据 因为上传的路径一直被限定在C:\Program\IIS\Express 一直限制这个文件下, 想要解决这个问题. 在谷歌浏览器 ...

  5. TornadoFx学习笔记(1)——常用的代码片段

    Tornadofx是基于JavaFx的一个kotlin实现的框架 之后看情况补充.. 1.读取resources文件夹中的文件 如图 想要读取config.properties文件,有两种方法 在cl ...

  6. python 进程Queue

    1.作用:进程之间的数据交互 2.常用方法 """ 对象.put() 作用:放入队列一个数据 对象.get() 作用:取队列一个数据,若队列没有值,则阻塞 对象.empt ...

  7. ORM补充文件

    models.FileField(verbose_name='头像', upload_to='avatars/') 文件 content = models.TextField() 文本 models. ...

  8. Android studio 报错Error:Internal error: (java.lang.ClassNotFoundException) com.google.wireless.android.sdk.stats.IntellijIndexingStats$Index

    Android studio运行make build报错 解决方法 在studio的File-->Settings-->Build, Execution, Deployment---> ...

  9. 个人任务Day3

    昨日成果: 学习有关java的网络爬虫知识. 今日任务: 向数据库中完善数据,并写出选择查看团队博客的界面.

  10. 【java面试】集合类篇

    java中主要的类集合接口如下 Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├Has ...