json

json存在的价值
json文件可以在任何语言之间都能解析,让数据在不同的编程语言之间都可以传输,所以json,用于不同编程语言之间的数据交流。我们在写文件保存数据时,可以先转换成json数据,方便以后的数据的回收利用。比如说我们虽然会有语言差异的限制,但是数据却是通用的。

json 数据格式要求:

有且只有一个数据;唯一的数据必须json支持的数据类型对应的数据。

json 支持的数据类型有:

  • 数字 :10、12.3、3e3
  • 字符串 : “abc”、“\tabc\n123”
  • 布尔 : true、false
  • 空值 : null
  • 数组 : [数据1, 数据2,…]
  • 字典 :{键1:值1, 键2:值2,…}

Python

JSON

dict

Object

list

Array

tuple

Array

str

String

int

Number

float

Number

True

true

False

false

None

null

注意布尔、空值的区别 转换:

  • json数据转Python 数据
import json
json.loads(json格式字符串)
  • python 数据转 json
import json
json.dumps(python格式字符串)

正则表达式

正则表达式是一种可以让复杂的字符串问题变得简单的工具。

导入

import re

语法

函数用法

函数

说明

re.match

将正则表达式模式匹配到字符串的开头

fullmatch

将正则表达式模式匹配到所有字符串

search

在字符串中搜索是否存在模式

sub

替换在字符串中找到的模式的出现

subn

与 sub 相同,但也返回进行的替换次数

split

根据出现的模式拆分字符串

findall

查找字符串中所有出现的模式

finditer

返回一个迭代器,为每个匹配项生成一个 Match 对象

compile

将一个模式编译成一个 Pattern 对象

purge

清除正则表达式缓存

escape

反斜杠字符串中的所有非字母数字

特殊字符:

字符

功能

“.”

匹配除换行符以外的任何字符

“^”

匹配字符串的开头

“$”

匹配字符串的结尾或字符串结尾的换行符之前

“*”

匹配前面 RE 的 0 个或多个(贪婪)重复。贪婪意味着它将匹配尽可能多的重复

“+”

匹配前面 RE 的 1 个或多个(贪婪)重复

“?”

匹配前面 RE 的 0 或 1(贪心)。 *?,+?,??前三个特殊字符的非贪婪版本

{m,n}

匹配前面 RE 的 m 到 n 次重复

{m,n}?

上述的非贪婪版本

“\”

转义特殊字符或表示特殊序列

[]

表示一组字符。作为第一个字符的“^”表示补集

(…)

匹配括号内的 RE。稍后可以在字符串中检索或匹配内容

(?aiLmsux)

这些字母设置了下面定义的相应标志

(?:…)

正则括号的非分组版本

(?P…)

组匹配的子字符串可以通过名称访问

(?P=name)

匹配名为 name 的组之前匹配的文本

(?#…)

一条评论;忽略

(?=…)

匹配 if … 匹配下一个,但不使用字符串

(?!..)

如果 … 下一个不匹配则匹配

(?<=…)

如果前面有 … 则匹配(必须是固定长度)

(?<!..)

如果前面没有 … 则匹配(必须是固定长度)

(?(id/name)yes/no)

如果匹配 id/name 的组匹配 yes 模式,否则匹配(可选)no 模式。

特殊序列
由“\”和下表中的一个字符组成。如果普通字符不在列表中,则生成的 RE 将匹配第二个字符

字符

功能

\number

匹配相同编号的组的内容

\A

仅匹配字符串的开头

\Z

仅匹配字符串的末尾

\b

匹配空字符串,但只匹配单词的开头或结尾

\B

匹配空字符串,但不匹配单词的开头或结尾

\d

匹配任何十进制数字; [0-9]

\D

匹配任何非数字字符;相当于 [^\d]

\s

匹配任何空白字符; 相当于[ \t\n\r\f\v]

\S

匹配任何非空白字符;相当于 [^\s]。

\w

匹配任何字母数字字符;相当于 [a-z A-Z 0-9 _ ]

\W

匹配 \w 的补码。

\\

匹配文字反斜杠。

常用正则表达式大全

匹配:
	匹配中文字符: [\u4e00-\u9fa5]   
	匹配双字节字符(包括汉字在内):[^x00-xff] 
	匹配空白行:ns*r 
	匹配HTML标记:< (S*?)[^>]*>.*?|<.*? /> 
	匹配首尾空白字符:^s*|s*$ 
	匹配Email地址:w+([-+.]w+)*@w+([-.]w+)*.w+ ([-.]w+)* 
	匹配网址URL:[a-zA-z]+://[^s]* 
	匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 
	匹配国内电话号码:d{3}-d{8}|d{4}-d{7} 
	匹配腾讯QQ号:[1-9][0-9]{4,} 
	匹配中国邮政编码:[1-9]d{5} (?!d) 
	匹配身份证:d{15}|d{18} 
	匹配ip地址:d+.d+.d+.d+
	 
数字: 
   ^[1-9]d*$    								 	 //匹配正整数 
   ^-[1-9]d*$  								     //匹配负整数 
   ^-?[1-9]d*$  									 //匹配整数 
   ^[1-9]d*|0$  									 //匹配非负整数(正整数 + 0) 
   ^-[1-9]d*|0$  				 				 //匹配非正整数(负整数 + 0) 
   ^[1-9]d*.d*|0.d*[1-9]d*$   					 //匹配正浮点数 
   ^-([1-9]d*.d*|0.d*[1-9]d*)$  				   	 //匹配负浮点数 
   ^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$ 			 //匹配浮点数 
   ^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$ 			    //匹配非负浮点数(正浮点数 + 0) 
   ^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$          //匹配非正浮点数(负浮点数 + 0) 
  
字符串: 
  ^[A-Za-z]+$  		//匹配由26个英文字母组成的字符串 
   ^[A-Z]+$  		//匹配由26个英文字母的大写组成的字符串 
  ^[a-z]+$  			//匹配由26个英文字母的小写组成的字符串 
   ^[A-Za-z0-9]+$    //匹配由数字和26个英文字母组成的字符串 
  ^w+$  				//匹配由数字、26个英文字母或者下划线组 成的字符串 
  
验证: 
  验证用户密码:“^[a-zA-Z]w{5,17}$”
  #正确格式为:以字母开头,长度 在6-18之间,只能包含字符、数字和下划线。 
  验证是否含有^%&'',;=?$"等字符:“[^%& '',;=?$x22]+” 
  验证Email地址:“^w+ [-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$” 
  验证InternetURL:“^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$” 
  验证电话号码:“^((d{3,4})|d{3,4}-)?d{7,8}$” 
  #正确格式为:“XXXX-XXXXXXX”,“XXXX- XXXXXXXX”,“XXX-XXXXXXX”, “XXX-XXXXXXXX”,“XXXXXXX”,“XXXXXXXX”。 
	验证身份证号(15位或18位数字):“^d{15}|d{}18$” 
	验证一年的12个月:“^(0?[1-9]|1[0-2])$”
	验证一个月的31天:“^((0?[1-9])|((1|2) [0-9])|30|31)$” 

限制:
	只能输入数字:“^[0-9]*$” 
  只能输入n位的数字:“^d{n}$” 
  只能输入至少n位数字:“^d{n,}$” 
   只能输入m-n位的数字:“^d{m,n}$” 
  只能输入零和非零开头的数字:“^(0|[1-9][0-9]*)$” 
  只能 输入有两位小数的正实数:“^[0-9]+(.[0-9]{2})?$” 
  只能输入有1-3位小数的正实数:“^[0-9]+(.[0-9] {1,3})?$” 
  只能输入非零的正整数:“^+?[1-9][0-9]*$” 
  只能输入非零的负整数:“^-[1-9] [0-9]*$” 
  只能输入汉字:“^[u4e00-u9fa5],{0,}$” 
  只能输入长度为3的字符:“^.{3}$” 
  只能输入由26个英文字母组成的字符串:“^[A-Za- z]+$” 
  只能输入由26个大写英文字母组成的字符串:“^[A-Z]+$” 
  只能输入由26个小写英文字母组成的字符串:“^[a-z]+$” 
  只能输入由数字和26个英文字母组成的字符串:“^[A-Za-z0-9]+$” 
  只能输入由数字、 26个英文字母或者下划线组成的字符串:“^w+$”
# 基本用法
result = re.fullmatch(r'a[MN\d]b', 'aNb')
# <re.Match object; span=(0, 3), match='aNb'>
result1 = re.fullmatch(r'a[^MN\d]b', 'aBb')
# <re.Match object; span=(0, 3), match='aBb'>
result2 = re.fullmatch(r'[1-9]\d{4,11}', '1234567')
# <re.Match object; span=(0, 7), match='1234567'>

# 分组
result3 = re.fullmatch(r'([A-Z]{3}\d{2})[\u4e00-\u9fa5][A-Z]{3}', 'WIN94和AWM')
result4 = re.fullmatch(r'(\d{2})([a-z])[\u4e00-\u9fa5]{2}\1\2', '98k就叫98k')
print(result4.match())
# AttributeError: 're.Match' object has no attribute 'match'
# 属性错误:'re.Match'对象没有属性'match'
result5 = re.fullmatch(r'([a-z])(\d{3})[\u4e00-\u9fa5]{2}\2', 'm416也叫416')
print(result5.span())
# (0, 9)

# 重复
message = '我今年18岁,月薪50088元,身高188,体重70公斤,8块腹肌。每年交308元的腾讯会员费。房贷每月3000元,车贷每月2288元。'
result6 = re.findall(r'\d+元', message)
# ['50088元', '308元', '3000元', '2288元']

# 捕获
result7 = re.findall(r'(\d+)元', message)
# ['50088', '308', '3000', '2288']

# 分支
mess = '我爱你,胜过我讨厌你'
result8 = re.findall(r'我([\u4e00-\u9fa5]|[\u4e00-\u9fa5]{2})你', mess)
# ['爱', '讨厌']

# 转义
result9 = re.findall(r'\\d+\.\d+', '\d.879')    # ['\\d.879']
message1 = '1:萝卜:单价2元,起售份数5 2:西红柿:单价3元,起售份数5 '
result10 = re.findall(r'\d+', message1)         # ['1', '2', '5', '2', '3', '5']
result11 = re.findall(r'\d+\b', message1)       # ['1', '5', '2', '5']
result12 = re.findall(r'\b\d+', message1)       # ['1', '2']
result13 = re.findall(r'\B\d+\B', message1)     # ['2', '3']

# match()
result14 = re.match(r'\d{4}', '2022.08.09 hello, world.')
print(result14.group())  # 2022

# search()
result15 = re.search(r'\d{4}', '2022.08.09 hello, world.')
print(result15.span())  # (0, 4)

# finditer()
result16 = re.finditer(r'\d{4}', '2022.08.09 hello, world.')
print(next(result16))
# <re.Match object; span=(0, 4), match='2022'>

# split()
result17 = re.split(r'\.| |,', '2022.08.09 hello,world')
# ['2022', '08', '09', 'hello', 'world']

# sub()
result18 = re.sub(r'\d', '*', '2022.08.09 hello, world.')
# '****.**.** hello, world.'

# group()
message2 = 'CHN:98, JPN:78, USA:86'
result19 = re.search(r'([A-Z]{3}):(\d{2})', message2)
print(result19.group(1))    # CHN

# (?!)
result20 = re.fullmatch(r'(?i)abc', 'ABc')
# <re.Match object; span=(0, 3), match='ABc'>

# (?s)
result21 = re.fullmatch(r'(?s)hello.world', 'hello\nworld')
# <re.Match object; span=(0, 11), match='hello\nworld'>