Python3 笔记 10 正则表达式与JSON

10-1 初识正则表达式 

 

是一个特殊的私服序列,可以帮助检测一个字符串是否与我们所设定的字符序列相匹配。

可以实现快速检索文本、实现替换文本的操作。

1、检测一串数字是否是电话号码

2、检测一个字符串是否符合e-mail格式

3、把一个文本里指定的单词替换为另外一个单词

 

平时处理:

a = 'C|C++|Java|Python'

print(a.index('Python') > -1)

print('Python' in a)

 

用正则表达式处理:

import re

a = 'C|C++|Java|Python'

r = re.findall('Python',a)

if len(r) > 0:

print('字符串中包含Python')

else:

print('No')

 

10-2 元字符与普通字符 

 

提取字符串中所有的数字:

import re

a = 'C2C++4Java7Python6'

r = re.findall('\d',a)

print(r)

#['2', '4', '7', '6']

\d:表示所有数字

 

‘Python’普通字符,'\d'元字符。正则表达式就是由一系列普通字符和元字符组成的。 

 

提取字符串中所有的非数字:

import re

a = 'C2C++4Java7Python6'

r = re.findall('\D',a)    #\D为非数字

print(r)

 

10-3 字符集

 

中间一个字符是c或者f的单词:

import re

s = 'abc,acc,adc,aec,afc,ahc'

r = re.findall('a[cf]c',s)

print(r)

#['acc', 'afc']

[]:字符集,关系

普通字符定界,确定某一个小段

 

中间一个字符不是c或者f的单词:

import re

s = 'abc,acc,adc,aec,afc,ahc'

r = re.findall('a[^cf]c',s)

print(r)

#['abc', 'adc', 'aec', 'ahc']

^取反操作

 

利用字符顺序省略字符,匹配c,d,e,f:

import re

s = 'abc,acc,adc,aec,afc,ahc'

r = re.findall('a[c-f]c',s)

print(r)

-:省略中间字符

 

10-4 概括字符集

 

\d可以用[0-9]表示:

import re

a = 'python1111java678php'

r = re.findall('[0-9]',a)

print(r)

 

\w匹配所有的数字和字符:

import re

a = 'python1111&_java678  \nph\rp'

r = re.findall('\w',a)

print(r)

\w只能匹配单词字符,也就是den[A-Za-z0-9_]

\W只匹配非单词字符,如空格、&、\n、\r等都为非单词字符

 

\s代表空白字符:空格、\n、\r等:

import re

a = 'python1111&_java678 \nph\rp'

r = re.findall('\s',a)

print(r)

#[' ', ' ', '\n', '\r']

 

常用的概括字符集:\d \D \w \W \s \S

. :匹配除换行符\n之外的其他所有字符

 

10-5 数量词

 

匹配三个字母的单词:

import re

a = 'python1111 java678php'

r = re.findall('[a-z]{3}',a)

print(r)

#['pyt', 'hon', 'jav', 'php']

 

匹配完整的单词:

import re

a = 'python1111 java678php'

r = re.findall('[a-z]{3,6}',a)

print(r)

#['python', 'java', 'php']

利用数量词{数量}多次重复

 

10-6 贪婪与非贪婪 

 

数量词有贪婪和非贪婪之分,一般来说Python倾向于贪婪的匹配方式。

{数量} ?变成非贪婪模式

import re

a = 'python1111 java678php'

r = re.findall('[a-z]{3,6}?',a)

print(r)

#['pyt', 'hon', 'jav', 'php']

 

10-7 匹配0次1次或者无限多次

 

用*匹配0次或者无限多次:

import re

a = 'pytho0python1pythonn2'

r = re.findall('python*',a)

print(r)

#['pytho', 'python', 'pythonn']

 

用+匹配一次或者无限多次:

import re

a = 'pytho0python1pythonn2'

r = re.findall('python+',a)

print(r)

#['python', 'pythonn']

 

用?匹配0次或者一次:

import re

a = 'pytho0python1pythonn2'

r = re.findall('python?',a)

print(r)

#['pytho', 'python', 'python']

多出来的n会被去掉,因为读到python时就满足了

用?来进行去重复的操作。

 

{3,6}?和 python? 时的问号用法不一样。 

 

10-8 边界匹配符 

 

QQ号的位数是否符合4-8位:

import re

qq = '10000004531'

r = re.findall('^\d{4,8}$',qq)

print(r)

#[]

^ $ 组成边界匹配符

^从字符串开头开始匹配

$从字符串末尾开始匹配

 

000$:最后三位是000

^000:开始三位是000

 

10-9 组 

 

python字符串是否重复出现三次:

import re

a = 'pythonpythonpythonpythonpython'

r = re.findall('(python){3}',a)

print(r)

一个括号对应一组。

[]里的字符是或关系

()里的字符是且关系

 

10-10 匹配模式参数 

 

忽略大小写:

import re

a = 'pythonC#\nJavaPHP'

r = re.findall('c#',a,re.I|re.S)

print(r)

re.I:忽略大小写,多个模式之间用|,这里的|是且的关系

re.S:匹配包括\n在内的任意字符

 

10-11 re.sub正则替换 

 

查找并替换:

import re

a = 'PythonC#\nJavaPHP'

r = re.sub('C#','GO',a,0)    #0:把所有的C#换成GO,1:只有第一个匹配到的被替换成GO

print(r)

#PythonGO

#JavaPHP

 

常规替换可以使用replace函数:

import re

a = 'PythonC#\nJavaPHP'

r = re.sub('C#','GO',a,0)

a = a.replace('C#','GO')    #是sub的简化版

print(r)

print(a)

 

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函数中去,返回的结果是新的字符串用来替换匹配到的词。

 

10-12 把函数作为参数传递

 

找出数字,大于等于6的替换成9,小于6的替换成0:

import re

 

def convert(value):

    matched = value.group()

    if int(matched) >= 6:

        return '9'

    else:

        return '0'

 

s = 'A8C3721D86'

r = re.sub('\d',convert,s)

print(r)

#A9C0900D99

函数调用函数的方式很灵活。

 

10-13 search与match函数

 

match:从字符串开始的地方开始匹配(首字母开始匹配)。

search:搜索整个字符串,直到找到第一个满足的结果并返回。

import re

s = 'A8C3721D86'

 

r = re.match('\d',s)

print(r)

r1 = re.search('\d',s)

print(r1)

#None

#

match和search返回的是对象,且只匹配一次,不会像findall一样匹配所有。

r.group()返回字符串

r.span()返回位置

 

10-14 group分组

 

提取life和python之间的字符: 

import re

 

s = 'life is short,i use python'

r = re.search('life(.*)python',s)

print(r.group(1))

group(0)是完整匹配结果

其他的组将从group(1)开始:

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

 

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 ')

 

10-15 一些关于学习正则的建议

 

python绝大多数用在爬虫上,需要用到正则表达式

搜索'常用正则表达式'并加以分析

 

10-16 理解JSON

 

JavaScript Object Notation, 是一种轻量级(与XML比)的数据交换格式

字符串是JSON的表现形式,符合JSON格式的字符串就是JSON字符串。

适合做跨语言交换数据。

 

10-17 反序列化

 

利用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'])

#    #解析出来是字典

#{'name': 'tai', 'age': 23}

#tai

#23

同样的JSON字符串,不同的语言会装换成不同的类型。其中对应到Python中是字典类型。

 

解析JSON数组:

import json

 

json_str = '[{"name":"tai","age":23,"flag":false},{"name":"tai","age":23}]'

print(type(student))

print(student)

#    #数组转成了列表

#[{'name': 'tai', 'age': 23, 'flag': False}, {'name': 'tai', 'age': 23}]   #列表中两个元素,每个元素是一个字典

 

字符串->语言下某一数据结构的过程:反序列化

 

10-18 序列化

 

json到Python对应的数据转换类型:

JSON

Python

object

dict

array

list

string

str

number

int

number

float

true

True

false

False

null

None

 序列化:

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)

#

#[{"name": "tai", "age": 23, "flag": false}, {"name": "tai", "age": 23}]

 

10-19 小谈JSON、JSON对象与JSON字符串 

 

JSON某种程度上是与Javascript平级的语言。

JSON对象、JSON、JSON字符串。

A语言数据类型 —JSON(中间数据类型)—> B语言数据类型

JSON有自己的数据类型,虽然和Javascript的数据类型差不多。

REST服务的标准格式,使用JSON。

我的个人博客:http://www.unconstraint.cn/

你可能感兴趣的:(Python)