Python3学习(四)

   我们在做项目中,经常会遇到检验手机号,邮箱一类的数据格式是否符合要求,
如果使用循环一个一个字符判断就太麻烦了。
   那么,有没有一种简单有效的方法用于检测数据格式的合理性呢?

7. 正则表达式

在介绍正则表达式前,先介绍一个Python内置函数,可以简单的判断某段字符是否存在于一个较长字符串内。

(1)index()函数

a = 'C|C++|Java|C#|Python|Perl'
print(a.index('Python'))

--------------------
14

index函数返回字符串匹配位置,即首字符所在字符串的位置,返回值大于-1则说明匹配成功。
还有一个"in"的用法
print(‘Python’ in a) # 输出结果:True

(2)re模块

在Python中提供了re模块来进行正则表达式匹配。

import re

a = 'C|C++|Java|C#|Python|Perl'
r = re.findall('Python', a)
print(r)
===========================
['Python']

findall函数第一个参数是要匹配的模式,第二个是源字符串。第三个参数是选择匹配模式。
findall函数简介
此例中,我们的pattern为具体字符串,这与用index函数没什么区别,正则表达式的用法精髓在于它能匹配一类字符而不是某个具体字符串。
例如:\d代表数字,\D代表非数字
(一般大写和小写表示的意义正好相反)

(3)常用的正则表达式字符集

这里列举一些常用的,详细的正则表达式介绍及元字符等可以查看:
正则表达式简介
正则表达式元字符

字符 描述
* 匹配前面的子表达式零次或多次。
+ 匹配前面的子表达式一次或多次。
? 匹配前面的子表达式零次或一次。
() 标记一个子表达式的开始和结束位置。
[abc] 字符集合。匹配所包含的任意一个字符。
{n} n 是一个非负整数。匹配确定的 n 次。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。
\S 匹配任何非空白字符。
\w 匹配字母、数字、下划线。等价于’[A-Za-z0-9_]’。
\W 匹配非字母、数字、下划线。等价于 ‘[^A-Za-z0-9_]’。
\ 转义字符,匹配上述特殊字符时使用

注:
① [a-z]{3, 5}
Python匹配时是贪婪的,所以检测出3位后继续检测,若要设置非贪婪,则需在后面加上?。[a-z]{3, 5}?
② 记住正则表达式匹配是按组匹配,而组是用小括号()括起来的,例如:(Python){10}将匹配10个Python,而Python{10}将匹配Pythonnnnnnnnnn
③ "^"表示从字符串开始处进行匹配,“$”表示从字符串末尾开始匹配。

import re
r = re.findall('^\d{3, 8}$', a)

说明是完全匹配3~8位的数字,若是9位数则不会匹配前8位。

(4)re中几个内置函数

  1. re.findall(pattern, string, flags=0)

第三个参数flag默认值为0,此时flag没有什么作用;若设置为re.I,则说明匹配时不区分大小写;若设置为re.S,则使得“.”生效(“.”用于匹配匹配除换行符之外的任何单个字符)设置多种模式请用“|”分隔。

  1. re.sub(pattern, repl, string, count=0, flags=0)
    我个人认为这个函数很强大,原因是他的第二个参数可以传入一个函数。
    官方对sub函数的解释是:Return the string obtained by replacing the leftmost non-overlapping occurrences of pattern in string by the replacement repl. If the pattern isn’t found, string is returned unchanged. repl can be a string or a function; if it is a string, any backslash escapes in it are processed. If repl is a function, it is called for every non-overlapping occurrence of pattern. The function takes a single match object argument, and returns the replacement string.

sub函数用于正则替换,第一个参数是正则表达式,第二个是要替换成什么,第三个是原字符串常量,第四个count等于0时无休止替换下去,等于1表示只替换第一个,第五个参数flags和findall的flags是一样的。
re.sub()的第三个参数还可以为函数,函数参数为正则表达式,返回结果用于替换原字符。传入的参数为对象,需要用group得到对象值。

import re

st = 'sdsd06df67ee2'

def convert(value):
	match = value.group()
	if int(match) <= 5:
		return 'a'
	else:
		return 'A'

ret = re.sub('\d', convert, st)
print(ret)

=========================
sdsdaAdfAAeea
  1. re.match(pattern, string, flags=0)
  2. re.search(pattern, string, flags=0)

match函数从字符串首字符开始匹配,而search查找字符串则只要按顺序找到一个就可以了。例如A0009,re.match(’\d’, s)是匹配不出来的,而re.search(’\D’, s)就可以匹配出来。

两个函数返回的是对象(假设是R)。
R.group()返回某组的值,R.span()返回的是对象的位置信息。

(5)group组

正则表达式中用括号表示一个组,而每个组都有编号,group可以传入这个编号,例如:

r = re.search('(life.*python)', s) # 由于这里只有一组,括号可以省略
print(r.group(0)) # 由于只有一组,所以0可以省略

group还可以传多个参数,将以元组形式返回。另外,r.groups()返回完整的匹配结果,且只返回括号中匹配的。

s = 'life is short, I use python'
r = re.search('life(.*)python(.*)python', s)
print(r.groups())

===========================
(' is short, I use ', ', I love ')

下面给大家推荐一个很全的常用正则表达式合集:
看我!点这里!!

8. JSON(JavaScript Object Notation)

这里介绍一种重要的数据格式——JSON。它是一种轻量级的数据交换格式,字符串是JSON的表现形式。可实现跨语言交换数据。它有三个特点:易于阅读、易于解析、网络传输效率高。

json应用场景1:浏览器发送请求获取json数据,在前端实现逻辑运算,呈现出我们所看到的效果。
json应用场景2:一个网站app不同的API服务是用不同语言写的,于是可以用json来进行跨语言数据传输。
json格式要用 双引号 将字符串引起来。

import json
json_str = '{"name":"Tom", "age":20}'
json.loads(json_str)  # 转换成字典等Python数据格式

=========================
{'name': 'Tom', 'age': 20}

上述过程称为反序列化。

序列化:与上述过程相反。
附json和Python数据结构的转换:

JSON Python
object dict
array list
string str
number int
number float
true True
false False
null None

序列化:将Python数据格式转换成JSON格式
json.dumps(student) #用于转换成json格式
序列化后的数据可存储在MongoDB(一种NoSQL)中。

关于JSON的几个名词

JSON:是一种数据交换格式,它已经成为ECMAScript(由W3C,万维网联盟制定)的一个子集了,而ECMAScript的子集还包括我们熟知的JavaScript、微软最近开发的TypeScript等。

JSON对象:一般只在JavaScript中有这个说法。

JSON字符串:也是在JavaScript中的概念,符合JSON格式的字符串就是JSON字符串。

========================
下节我们将介绍Python的高级语法。

发布了7 篇原创文章 · 获赞 10 · 访问量 2655

猜你喜欢

转载自blog.csdn.net/weixin_41076275/article/details/104156448