正则表达式:字符串的一种描述的模式。
JSON:JSON是一种数据格式。
环境:python3.7,开发工具:vs code。

#正则表达式与JSON,正则表达式多用于爬虫
a = 'test|@|python'
import re
ab = 'C|C++|Java|Python'
r = re.findall('Python',ab)
if len(r) > 0:
    #print('包含该字符!')  
    pass 
else:
    #print(' ')
    pass 

b= 'dasd8da9ad12sa'
re.findall('\d',b)  #'\d'数字,'\D'非数字

re.findall('\D',b)

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

re.findall('a[bd]c',s)  #中间一个字符是b或者d的单词:
re.findall('a[^bd]c',s)  #中间一个字符不是b或者d的单词:
rs = re.findall('a[b-f]c',s)    #利用字符顺序省略字符,匹配b,c,d,e,f:

#\d = [0-9] ,\w只能匹配单词字符,也就是den[A-Za-z0-9_]
#\W只匹配非单词字符,如空格、&、\n、\r等都为非单词字符
#\s代表空白字符:空格、\n、\r等空白字符; \S	匹配非空白
ro = re.findall('\w',a)
#print(ro)
e = 'python1111&_java678 \nph\rp'
re.findall('\s',e)

#{}
c = 'python11aa11 java678php'
s = 'abc1defghiqqqqi'
three =  re.findall('[a-z]{3}',c)#选择三个相连的小写字母
fore1 =  re.findall('[a-z]{1,13}',s)#默认贪婪匹配
# print(fore1)

fore2 =  re.findall('[a-z]{3,6}?',c)#非贪婪匹配-尽可能短的匹配
# print(fore2)

#匹配0次或者无限多次
py = 'pytho0python1pythonn2epythons'
#print(re.findall('python*',py))

#用+匹配一次或者无限多次:
#print(re.findall('python+',py))

#用?匹配0次或者一次:  ?有没有
#print(re.findall('python?',a))

qq = '10000004531'
#print(re.findall('^\d{4,10}1$',qq)) #^从字符串开头开始匹配 $从字符串末尾开始匹配 000$:最后三位是000 ^000:开始三位是000

pyth = 'pythonpythonpythonpythonpython'
#print(re.findall('(python){3}',pyth)) #查看python是否重复3次
#print(re.findall('[python]{3}',pyth)) #[]里的字符是或关系 ,()里的字符是且关系??

#匹配模式参数 
pipei = 'pythonC#\nJavaPHP'
re.findall('C#.{1}',pipei,re.I|re.S)#re.I:忽略大小写,多个模式之间用|,这里的|是且的关系 ,re.S:匹配包括\n在内的任意字符


#re.sub正则替换 
subjet = 'PythonC# JavaPHPC#'
#o = re.sub('C#','GO',subjet,0) ,#0:把所有的C#换成GO,1:只有第一个匹配到的被替换成GO.2,只有前两个
#print(id(subjet))
#subjet = subjet.replace('C#','GO') #常规替换
#print(id(subjet))     #str不可变
#print(o)
#print(subjet)

#sub的第二种用法:
def convert(value):
    #print(value) #看value的值,更好理解convert函数.
    matched = value.group()
    return '!!'+matched+'!!'
#将C#前后加!!操作 ,把函数当作参数传入sub函数种,具体业务由convert处理。
ro = re.sub('C#',convert,subjet,2)  
#print(ro)

#找出数字,大于等于6的替换成9,小于6的替换成0:
numbs = '8C3721D86A'
def dig_sep_convert(value):
    matched = value.group()
    #print(type(matched))
    if int(matched) >= 6 :
        return '9'
    else:
        return '0'

dig_sep = re.sub('[0-9]',dig_sep_convert,numbs,0)
#print(dig_sep)

#match 与 search
#match 从字符串开始的地方开始匹配(首字母开始匹配)。
#search:搜索整个字符串,直到找到第一个满足的结果并返回。
matchedstr = re.match('[0-9]',numbs)
#print(matchedstr.group()) #以str形式返回对象中match的元素
#print(matchedstr.span()) #span	以tuple形式返回范围
searchstr = re.search('[0-9]',numbs)
#print(searchstr.group())

#python中的空指针异常.
# Traceback (most recent call last):
#   File "d:/Pyproject/p10.py", line 102, in <module>
#     print(matchedstr.span())
# AttributeError: 'NoneType' object has no attribute 'span'

s = 'life is short,I use python,I love python'
s = re.search('life(.*)python(.*)python',s)
#print(s.group()) #group(0)是完整匹配结果 
#print(s.group(1)) #group(1)是匹配第一个(.*)的结果
#print(s.group(2)) #group(2)是匹配第二个(.*)结果 
#print(s.groups()) #(' is short,I use ', ',I love ')


#JSOn:JSON是一种数据格式.
#json.dumps将一个Python数据结构转换为JSON;
#json.loads将一个JSON编码的字符串转换回一个Python数据结构:
import json
#student_info = [{"name":"li","age":23,"flag":False},{"name":"liu","age":25,"flag":False}]
json_str = '{"name":"tai","age":23}' 
jsonstr =  json.loads(json_str)
print(jsonstr['age'])
print(type(json.dumps(jsonstr)))