json、正则

json

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

json 数据格式要求:

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

json 支持的数据类型有:

  • 数字 :10、12.3、3e3
  • 字符串 : “abc”、“\tabc\n123”
  • 布尔 : true、false
  • 空值 : null
  • 数组 : [数据1, 数据2,…]
  • 字典 :{键1:值1, 键2:值2,…}
PythonJSON
dictObject
listArray
tupleArray
strString
intNumber
floatNumber
Truetrue
Falsefalse
Nonenull

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

  • 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'>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值