python进阶(十七)正则json(上)
?
1. 一個列表中所有的數字都是重復2次,但是有一個數字只重復了一次。
請找出重復一次的數字,不可以使用內置函數。
[2,2,1,1,0,4,3,4,3]
方法1:通過字典計數,找到value等于1的key
s = [2,2,1,1,0,4,3,4,3]
m = {}
for i in s:
??? if i in m:
??????? m[i]+=1
??? else:
??????? m[i] = 1
print(m)
for k,v in m.items():
??? if v ==1:
??????? print (k)
?
#運行結果:
#{2: 2, 1: 2, 0: 1, 4: 2, 3: 2}
#0
?
方法2:使用排序,判斷在頭、中、尾三種情況
s = [2,2,1,1,0,4,3,4,3]
s = sorted(s)
for i in range(len(s)):
??? if i == 0 and s[1] !=s[0]:
??????? print(s[0])
??????? break
??? elif i == lens(s)-1 and s[i] s=s[i-1]:
??????? print(s[i])
??? else:
??????? if i!=len(s)-1 and i!=0 and s[i]!=s[i+1] and s[i]!=s[i-1]:
??????????? print(s[i])
??????????? break
#運行結果:
#0
?
方法3:使用內置函數append和remove
s = [2,2,1,1,0,4,3,4,3,0,-1]
relist = []
for i in s:
??? if i in relist:
??????? relist.remove(i)
??? else:
??????? relist.append(i)
?
print(relist[0])
?
#運行結果:
#-1
?
方法4:使用字典,優點:哈希查找,速度快
s = [2,2,1,1,0,4,3,4,3,0,-1]
redict = {}
for i in s:
??? try:
??????? redict[i] +=1
??????? del redict[i]
??? except:
??????? redict[i] = 1
?
print(redict.keys())
#運行結果:
#dict_keys([-1])
print(list(redict.keys()))
#運行結果:
#[-1]
print(list(redict.keys())[0])
#運行結果:
#-1
?
輸出結果時,換個方法:
print(redict)?????????? ?#查看redict中的內容
#{-1: 1}
print(dir(redict))?????? ?#查看字典可用的方法
#['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
print(redict.popitem()) #使用pop.item方法,將字典轉換為tuple,且在源字典中刪除該組
#(-1, 1)
print(redict)???????? #再次查看redict,已經變成空,因為redict中只有一個key和value
{}
print(redict.popitem()[0])#所以,要將所有代碼寫在一起,防止pop后在取值取不到報錯
-1
?
?
d = {1:2,3:4}???????? #有兩組key和value的字典
print(d.popitem())
#(3, 4)???????????? ?#popitem出來的是第二組的key和value
print(d)??????????????
#{1: 2}???????????? ?#再次查看原字典,只留下未pop的數據
print(d.popitem())
#(1, 2)
?
?
2. 寫個程序可以處理下面的情況
Example 1:
Input: s = "leetcode", wordDict = ["leet", "code"]
Output: true
Explanation: Return true because "leetcode" can be segmented as "leet code".
?
Example 2:
Input: s = "applepenapple", wordDict = ["apple", "pen"]
0utput: true
Explanation: Return true because " applepenapple" can be segmented as "apple pen apple".
? ? ? ? ? ? ?Note that you are allowed to reuse a dictionary word.
?
Example 3:
Input: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
Output: false
?
?
方法1:
import re
s = "leetcode"
word_dict = ["leet","code"]
pattern = re.compile("("+"|".join(word_dict)+")")
print(pattern)
#re.compile('(leet|code)')
result = pattern.findall(s)
print(result)
#['leet', 'code']
print(len("".join(result))==len(s))
#True
?
?
import re
s = "leetcodex"
word_dict = ["leet","code"]
pattern = re.compile("("+"|".join(word_dict)+")")
print(pattern)
#re.compile('(leet|code)')
result = pattern.findall(s)
print(result)
#['leet', 'code']
print(len("".join(result))==len(s))
#False
?
?
方法2:
import re
s = "leetcode"
word_dict = ["leet","code"]
result = s
for i in word_dict:
??? result = "".join(re.split(i,result))
?
print(result == "")
#True
?
?
import re
s = "leetcodex"
word_dict = ["leet","code"]
result = s
for i in word_dict:
??? result = "".join(re.split(i,result))
?
print(result == "")
#False
?
一、正則表達式
1、正則表達式 – 后向引用
正則表達式中,放在圓括號”()”中的表示是一個分組。然后我們就可以對整個組使用一些正則操作,例如重復操作符。
要注意的是,只有”()”才能形成分組,””用于定義字符串,而“{}”用于定義重復操作。當用”()”定義了一個正則表達式分組后,正則引擎就會把匹配的組按照順序進行編號,然后存入緩存中。這樣我們就可以在后面對已經匹配過的內容進行引用,這就叫后向引用。
??? 1. 通過索引引用
\數字
\1表示引用第一個分組,\2引用第二個分組,以此類推,而\0則表示引用整個被匹配的正則表達式本身。
??? 2. 通過命名分組名進行引用(如果有的話)
(?P=name)
字符P必須是大寫的P,name表示命名分組的分組名。
注意:
這些引用都必須是在正則表達式中才有效,用于匹配一些重復的字符串。
??? 1) 通過默認分組編號進行后向引用
import re
s = "22 22 aa"
print(re.search(r"(\d{2}) \1",s).group()) ?#\1的意思是必須匹配和第一個分組匹配一樣的內容
#22 22?????????????????????????? ?#后向引用,引用了分組1
s = "22 aa 22"
print(re.search(r"(\d{2}) \1",s).group())
#AttributeError: 'NoneType' object has no attribute 'group'
s = "22 21 22"
print(re.search(r"(\d{2}) \1",s).group()) #雖然21滿足\d{2},但是21和22的內容不一樣,即
\1匹配到的內容和\d{2}匹配到的內容不一樣,所以未匹配成功
#AttributeError: 'NoneType' object has no attribute 'group'
\1表示第一個分組匹配到的內容
??? 2) 通過命名分組進行后向引用
import re
res = re.search(r'(?P<name>go)\s+(?P=name)\s+(?P=name)', 'go go go')
print(res.group())
#go go go
3) 交換字符串的位置
import re
s = "abc.xyz"
res = re.sub(r"(.*)\.(.*)",r"\2.\1",s)
print(res)
#xyz.abc
?
?
2、正則表達式 – 前向肯定斷言與后向肯定斷言
前向肯定斷言的語法:
(?<=pattern)
前向肯定斷言表示你希望匹配的字符串前面是pattern匹配的內容時,才匹配
后向肯定斷言的語法是:
(?=pattern)
后向肯定斷言表示你希望匹配的字符串是后面是pattern匹配的內容時,才匹配
import re
print(re.search(r"(?<=abc)\d+","abc123").group())#匹配前面是abc的多個數字
#123
print(re.search(r"(?<=abc)\d+","a1c123").group())
#AttributeError: 'NoneType' object has no attribute 'group'
?
print(re.search(r"\d+(?=abc)","123abc").group()) #匹配后面是abc的多個數字
#123
print(re.search(r"\d+(?=abc)","123a1c").group())
#AttributeError: 'NoneType' object has no attribute 'group'
?
?
前向肯定斷言括號中的正則表達式必須是能確定長度的正則表達式,比如\W{3},而不能寫成\w*或者\w+或者\w?等這種不能確定個數的正則模式符。
import re
s = "aaa111aaa,bbb222,333ccc"
print(re.findall(r"(?<=[a-z]{3})\d+(?=[a-z]+)",s))? ?#指定前后肯定斷言
#['111']
print(re.findall(r"(?<=[a-z]{3})\d+",s))???????? ?#指定前向肯定斷言
#['111', '222']
print(re.findall(r"\d+(?=[a-z]+)",s))??????????? ?#指定后向肯定斷言
#['111', '333']
print(re.findall(r"[a-z]+\d+[a-z]+",s))???????? ??#普通匹配方法
#['aaa111aaa']
?
?
try:
??? matchResult = re.findall(r"(?<=[a-]+)\d+(?=[a-z+])",s)#前向肯定未固定寬度
except Exception as e:
??? print(e)
else:
??? print(matchResult)
?
#look-behind requires fixed-width pattern ?#前向匹配需要固定寬度的匹配模式
?
?
3、正則表達式 – 前向否定斷言與后向否定斷言
前向否定斷言的語法:
(?<!pattern)
前向否定斷言表示你希望匹配的字符串的前面不是pattern匹配的內容時,才匹配。
后向否定斷言的語法:
后向否定斷言表示你希望匹配的字符串的后面不是pattern匹配的內容時,才匹配。
和前向肯定斷言一樣,前向否定斷言括號中的正則表達式必須是能確定長度的正則表達式,比如\W{3},而不能寫成\w*或者\w+或者\w?等這種不能確定個數的正則模式符。
import re
s = "aaa111aaa,bbb222,333ccc"
print(re.findall(r"(?<![a-z]{3})\d+(?![a-z]+)",s)) ?#指定前后否定斷言
#['1', '22', '33']
print(re.findall(r"(?<![a-z]{3})\d+",s))???????? #指定前向否定斷言
#[['11', '22', '333']
print(re.findall(r"\d+(?![a-z]+)",s))????????? ?#指定后向否定斷言
#['11', '222', '33']
print(re.findall(r"[a-z]+\d+[a-z]+",s))???????? #普通匹配方法
#['aaa111aaa']
?
?
try:
??? matchResult = re.findall(r"(?<![a-]+)\d+(?![a-z+])",s)#前向否定斷言未確定長度
except Exception as e:
??? print(e)
else:
??? print(matchResult)
?
#look-behind requires fixed-width pattern
?
===============================================================
二、JSON
1、使用Python語言來編碼和解碼JSON對象
Python的json模塊序列化和反序列化分別是dumps和loads
json.dumps():將一個Python對象編碼成JSON字符串
json.loads():將JSON格式字符串解碼成Python對象
對簡單的數據類型可以直接處理。如:string,Unicode,int,float,list,tuple,dict
?
2、JSON簡介
JSON:JavaScript Object Notation(JavaScript對象表示法)
JSON:是存儲和交換文本信息的語法。類似XML(存儲數據的格式,有格式的存儲數據)
JSON比XML更小、更快,更易解析。
?
?3、JSON語法與語法規則
1) JSON語法:
JSON語法是JavaScript語法的子集。
2) JSON語法規則:
JSON語法是JavaScript對象表示法語法的子集。
1. 數據在名稱/值對中
2. 數據由逗號分隔
3. 花括號保存對象
4. 方括號保存數組
?
4、JSON名稱/值對
Json數據的書寫格式是:
名稱/值對
名稱/值對包括字段名稱,后面寫一個冒號,然后是值,比如:
“firstName”:”John”
等價于下面這條JavaScript語句:
firstName = “John”
?
JSON值可以是:
數字(整數或浮點數)
字符串(在雙引號中)
邏輯值(true 或false),區別于Python的True和False
數組(在方括號中)
對象(在花括號中)
null
?
5、JSON對象
JSON對象是在花括號中書寫的。對象可以包含多個名稱/值對。比如:
{“firstName”:”John”,”lastName”:”Doe”}
這等價于JavaScript語句:
firstName = “John”
lastName = “Doe”
?
6、JSON數組
JSON數組是在方括號中書寫的。數組可以包含多個對象。比如:
a = {
??? "employees":[
??????? {"firstName":"John","lastName":"Doe"},
??????? {"firstName":"Anna","lastName":"Smith"},
??????? {"firstName":"Peter","lastName":"Jones"}
??? ]
}
?
print(a)
在上面的例子中,對象”employees”是包含三個對象的數組。每個對象代表一條關于某人(有姓和名)的記錄。
?
?7、JSON解碼:
1)將json格式字符串解碼成Python對象,我們使用的是json.loads()函數,可以將
簡單數據類型解碼成Python對象。
json.loads?????????????????????????? #將json串轉換為dict類型
>>> s = '{"name":"hehe","age":"18"}'????? #s定義了一個json串
>>> print(s)
{"name":"hehe","age":"18"}
>>> print(type(s))??????????????????????? ?#json串的數據類型是str
<class 'str'>
>>> import json?????????????????????????? #引入json包
>>> json.loads(s)??? ?????????????????????#json.loads(s)將json串轉換為dict類型
{'name': 'hehe', 'age': '18'}
>>> print(type(json.loads(s)))????????????? #查看json.loads后的數據類型,是dict
<class 'dict'>
>>> s ??????????????????????????????????#查看經過json.loads后的s是否有變化
'{"name":"liuyujing","age":"18"}'?????????? ??#s沒有變化
>>> s1 = json.loads(s)
>>> print(type(s1))
<class 'dict'>
>>> print(s)???????????????????????? ???#s是str類型,但是print(s)是沒有””的
{"name":"liuyujing","age":"18"}
>>> print(type(s))
<class 'str'>
>>> s??????????????????????????????? ?#交互模式下,直接s會顯示’’
'{"name":"liuyujing","age":"18"}'
?
>>> data = [{'a':"Aasdf",'b':(2,4),'c':3.0}]? ??#原始數據中有tuple(2,4)
>>> json.dumps(data)
'[{"a": "Aasdf", "b": [2, 4], "c": 3.0}]'?????? ?#經過json編碼后,變成了JSON的數組
>>> json.loads(json.dumps(data))?????? #經過json解碼后,原tuple類型轉化成list類型
[{'a': 'Aasdf', 'b': [2, 4], 'c': 3.0}]
#編碼過程中,Python中的list和tuple都被轉化成json的數組,而解碼后,json的數組最終轉化為Python的list,無論原來是list還是tuple。
2)從json到Python的類型轉化
| JSON字符串類型 | Python類型 |
| object | dict |
| array | list |
| string | unicode |
| number(int) | int |
| uumber(real) | float |
| true | True |
| false | False |
| null | None |
>>> a = [{1:12, 'a':12.3}, [1,2,3], (1,2), 'asd', 'ad', 12, 13, 3.3,True,False,None]
>>> json.dumps(a)
'[{"1": 12, "a": 12.3}, [1, 2, 3], [1, 2], "asd", "ad", 12, 13, 3.3, true, false, null]'
>>> json.loads(json.dumps(a))
[{'1': 12, 'a': 12.3}, [1, 2, 3], [1, 2], 'asd', 'ad', 12, 13, 3.3, True, False, None]
注意:
json格式的字符串解碼成Python對象以后,String類型都變成了Unicode類型,數組變成了list,不會回到原來的元祖類型,字典key的字符類型也被轉成Unicode類型。
?
?
8、JSON編碼
1). 使用json.dumps()方法來將一個Python數據類型列表編碼成json格式的字符串。
json.dumps()????????????????????? #將dict類型,轉換為json串
>>> print(json.dumps(s1))????????????? ?#在上面已說明,s1是字典類型
{"name": "liuyujing", "age": "18"}
>>> type(s1)
<class 'dict'>
>>> s2 = json.dumps(s1)??????????????? #json.dumps()將字典類型轉換為json串
>>> print(s2)
{"name": "liuyujing", "age": "18"}
>>> print(type(s2))
<class 'str'>
>>> s2
'{"name": "liuyujing", "age": "18"}'
?
??? 2)從Python到JSON字符串類型轉化
>>> import json
>>> data = [{'a':"A",'b':(2,4),'c':3.0}]
>>> res = repr(data)???????????? #有什么用?
>>> print("data :", res)
data : [{'a': 'A', 'b': (2, 4), 'c': 3.0}]
>>> data_json = json.dumps(data)
>>> print(data_json)
[{"a": "A", "b": [2, 4], "c": 3.0}]
#觀察兩次打印的結果,會發現Python對象被轉成JSON字符串以后,跟原始的repr()輸出的結果會有些特殊的變化,原字典中的元祖被改成了json類型的數組。
在json編碼的過程中,會存在從Python原始類型轉化json類型的過程,但這兩種語言的類型存在一些差異,對照表如下:
| Python類型 | JSON字符串類型 |
| dict | object |
| list,tuple | array |
| str,Unicode | string |
| int,long,float | number |
| True | true |
| False | flase |
| None | null |
json.dumps支持將以上Python類型轉換為JSON字符串類型
>>> json.dumps({1:2})???????????? #會自動將dict的key值加上””
'{"1": 2}'
>>> json.loads(json.dumps({1:2}))? ?#loads后,原dict中的key值的””依然存在
{'1': 2}
?
>>> json.dumps([1,2])??????????? ?#將list轉換為數組(array)
'[1, 2]'
>>> json.dumps((1,2))??????????? ?#將tuple轉化為數組(array)
'[1, 2]'
>>> json.dumps(["hehe"])
'["hehe"]'
>>> json.dumps(["1",2,{1:2},("asx")])?
'["1", 2, {"1": 2}, "asx"]'???????? #依次將list中的每個元素轉換為對應的JSON字符串類型
>>> json.dumps(["1",2,{1:2},("asx","jing")])
'["1", 2, {"1": 2}, ["asx", "jing"]]'? ? ??
>>> type(("asx"))? ? ? ? ? ? ? ??
<class 'str'>
?
>>> json.dumps(True)
'true'
>>> json.loads(json.dumps(True))
True
?
>>> json.dumps(False)
'false'
>>> json.loads(json.dumps(False))
False
?
>>> json.dumps(None)
'null'
>>> json.loads(json.dumps(None))#無返回值
>>>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
>>> print(json.loads(json.dumps(None)))
None
?
3) Json.dumps()
函數原型
?
9、eval?????????????????????????????? #將json串轉換為dict
>>> s????????????????????????????????? #s是個json串
'{"name":"liuyujing","age":"18"}'
>>> eval(s)?????????????????????????? ??#eval()可以將json串轉換為dict
{'name': 'liuyujing', 'age': '18'}
>>> s??????????????????????? ??????????#經過eval后的s沒有什么變化
'{"name":"liuyujing","age":"18"}'
>>> print(type(eval(s)))????????????????? #eval()可以將json串轉換為dict
<class 'dict'>
?
?10、json編碼
函數原型:
dumps(obj, skipkeys = False, ensure_ascii= True, check_circular=True, allow_nan = True, cls = None, indent = None, separators = None, encoding = “utf- 8”, default = None,sort_keys = False, **kw)
該方法返回編碼后的一個json字符串,是一個str對象encodejson.
dumps函數的參數很多,但是不是所有的都必須弄清楚,下面只說明幾個比較常用的參數。
?
???? 1) sort_keys:
是否按字典排序(a到z)輸出。因為默認編碼成json格式字符串后,是緊湊輸出,并且也沒有順序的,不利于可讀。
>>> data = [{"a":"A","x":(2,4),"c":3.0,"b":"4"},]
>>> json.dumps(data)
'[{"a": "A", "x": [2, 4], "c": 3.0, "b": "4"}]'???? ?#key值無順序
>>> json.dumps(data,sort_keys =? True)? #按照key值排序輸出,且也轉化為Json字符
'[{"a": "A", "b": "4", "c": 3.0, "x": [2, 4]}]'????? #串類型
>>> data = {1:2,53:4,5:6}
>>> json.dumps(data,sort_keys = True)
'{"1": 2, "5": 6, "53": 4}'???????????????? ??#依然會按照key值排序
>>> data = {1:2,53:4,"a":6}????????????? ?#key值存在兩種類型
>>> json.dumps(data,sort_keys = True)
TypeError: '<' not supported between instances of 'str' and 'int'?
#報錯,在int與str之間無法比較<
>>> data = {"1":"2","53":4,"a":6}???????? ?#key值都是str,有數字也有字母
>>> json.dumps(data,sort_keys = True)
'{"1": "2", "53": 4, "a": 6}'???????????????? #能夠排序
?
>>> ord("53")? ? ? ? ? ? ? ? ? ? ? ??
Traceback (most recent call last):
? File "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 2 found
TypeError: ord()期望得到一個字符,但是找到了長度為2的字符串
?
2) indent:
設置參數縮進顯示的空格數??s進顯示使讀起來更加清晰。
>>> data = {"1":"2","53":4,"a":6}
>>> json.dumps(data,sort_keys = True,indent = 3)? #無print.換行輸出\n
'{\n?? "1": "2",\n?? "53": 4,\n?? "a": 6\n}'
>>> print(json.dumps(data,sort_keys = True,indent = 3))
{
?? "1": "2",
?? "53": 4,
?? "a": 6
}??????????????????????????????????????????? ?#有print,每層縮進3格
?
?
>>> data = {"1":"2","53":[1,2,3,4,5,6],"a":6}?????? ?#”53”key的值是一個數組
>>> print(json.dumps(data,sort_keys = True,indent = 3))? #設置輸出每層縮進3
{
?? "1": "2",?????????????????????????????????? #”1”,”a”,”53”是一層,
?? "53": [???????????????????????????????? ???#[1,2,3,4,5,6]是第二層
????? 1,?????????????????????????????????? ??#遇到{}和[]和,會換行
????? 2,
????? 3,
????? 4,
????? 5,
????? 6
?? ],
?? "a": 6
}
3) separators:
separators:參數的作用是去掉逗號”,”和分號”;”后面的空格,從上面的輸出結果都能看到”,”與”:”后面都有個空格,這都是為了美化輸出結果的作用,但是在我們傳輸數據的過程中,越精簡越好,冗余的東西全部去掉,因此就可以加上separators參數對傳輸的json串進行壓縮。該參數是元祖格式的。
>>> data = {"1":"2","53":4,"a":6}
>>> json.dumps(data)
'{"1": "2", "53": 4, "a": 6}'???????????????? ?#”:”和”,”后都有空格
>>> len(json.dumps(data))????????????? ??#不去掉”:”和”,”后的空格,長度是27
27
>>> json.dumps(data,separators = (",",":"))
'{"1":"2","53":4,"a":6}'????????????????? ???#json串進行了壓縮,在”:”和”,”后都沒有空格
>>> len(json.dumps(data,separators = (",",":")))#去掉空格,長度是22
22
#從結果看出,通過移除多余的空白字符,達到了壓縮數據的目的。
#海量數據處理時,很重要,能省很多字節
>>> len(json.dumps(data,separators = (",")))
Traceback (most recent call last):
? File "<stdin>", line 1, in <module>
? File "D:\Python36\lib\json\__init__.py", line 238, in dumps
??? **kw).encode(obj)
? File "D:\Python36\lib\json\encoder.py", line 154, in __init__
??? self.item_separator, self.key_separator = separators
ValueError: not enough values to unpack (expected 2, got 1)
?????????????????????????????????????? ?#報錯,separators后面必須倆參數
?
4) skipkeys:
在encoding過程中,dict對象的key只可以是基本數據類型(str,Unicode,int,long,float,bool,None),如果是其他類型,那么在編碼過程中就會拋出TypeError的異常。skipkeys可以跳過那些非string對象的key的處理,就是不處理。
?
>>> data= [ { 'a':'A', 'b':(2, 4), 'c':3.0, (1,2):'D tuple' } ]
>>> print(u"不設置skipkeys 參數")
不設置skipkeys 參數
>>> try :
...???? res1 = json.dumps(data)????????? ?#skipkeys參數默認為False時
... except Exception as e:
...???? print(e)
...
keys must be a string
>>> print(u"設置skipkeys 參數")
設置skipkeys 參數
>>> print(json.dumps(data, skipkeys=True))? ?# skipkeys=True時
[{"a": "A", "b": [2, 4], "c": 3.0}]?? ??#不處理key值是(1:2)的數據
?
#list,set,dict不能做字典的key,tuple和類的實例可以做字典的key,所以skipkeys基本也就是跳過了tuple和類的實例
>>> data = [{"sr":2,(1,2):1,p:1},1]
>>> json.dumps(data,skipkeys = True)
'[{"sr": 2}, 1]'
?
5) ensure_ascii:
表示編碼使用的字符集,默認是True,表示使用ascii碼進行編碼。如果設置為False.就會以Unicode進行編碼。由于解碼json字符串時返回的就是Unicode字符串,所以可以直接操作Unicode字符,然后直接編碼Unicode字符串,這樣會簡單些。
>>> json.dumps("中國")????? ?#默認使用ascii碼進行編碼,中文不可直接使用
'"\\u4e2d\\u56fd"'
>>> json.dumps("中國",ensure_ascii = False)
'"中國"'????????????????????? #使用unicode進行編碼,中文可以直接使用
?
?
11、將類對象(實例)編碼成Json串
Python中的dict對象可以直接序列化為json的{},但是很多時候,可能用class表示對象,比如定義Employe類,然后直接去序列化就會報錯。原因是類不是一個可以直接序列化的對象,但我們可以使用dumps()函數中的default參數來實現。
>>> json.dumps({1:2})??????? #Python中的dict對象可以直接序列化為json的{}
'{"1": 2}'
>>> json.dumps([{1:2}])?????? #注意區別以上的例子
'[{"1": 2}]'
?
import json
class Employee(object):???? ?#定義類Employe
??? def __init__(self, name, age, sex, tel):
??????? self.name = name
??????? self.age = age
??????? self.sex = sex
??????? self.tel = tel
?
??? def obj_json(self, obj_instance): #定義方法obj_json,參數obj_instance,就是實例對象
??????? return {
??????? 'name': obj_instance.name,
??????? 'age': obj_instance.age,
??????? 'sex': obj_instance.sex,
??????? 'tel': obj_instance.tel }
?
emp = Employee('Lily', 24, 'female', '18223423423')
print(json.dumps(emp, default = emp.obj_json))?
# {"name": "Lily", "age": 24, "sex": "female", "tel": "18223423423"}
#emp實例首先使用emp.obj_json方法,拼成了一個dict,搞成了一個json串。
?
?
12、JSON反序列化為類對象
json串反序列化成類對象或者類的實例,使用的是loads方法中的object_hook參數來實現。
import json
class Employee(object):
??? def __init__(self, name, age, sex, tel):
??????? self.name = name
??????? self.age = age
??????? self.sex = sex
??????? self.tel = tel
?
emp = Employee('Lily', 24, 'female', '18223423423')
def jsonToClass(emp):?? # jsonToClass是函數,不是方法,emp是dict,不是實例
??? return Employee(emp['name'], emp['age'], emp['sex'], emp['tel'])
json_str = '{"name": "Lucy", "age": 21, "sex": "female", "tel": "15834560985"}' #json串
e = json.loads(json_str, object_hook = jsonToClass)
json_str作為一個參數,先轉化為字典,然后傳遞給jsonToClass,返回一個實例
print(e)
print(e.name)
#<__main__.Employee object at 0x0000020EC3C4E668>
#Lucy
?
?
?
小練習:
1. 匹配ip
ip = 0.0.0.0
每一位的數字的范圍是0-255
首先分析ip地址的特征:255.255.255.255;
1位: 0-9?????????? ? [0-9] \d
2位:10-99?????? ? [1-9]\d
2位以內:?????? ? ?? [1-9]?\d
3位:100-199????? 1\d{2}
3位:200-249????? 2[0-4]\d
3位:250-255????? 25[0-5]
import re
pattern = r"\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(" \
????????? r"?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
pattern = re.compile(pattern)
print(pattern.search("255.213.2.345"))
print(pattern.search("0.0.0.0").group())
print(pattern.search("2.0.0.0").group())
?
?
(?:)代表括號不代表分組,取消分組,使用group(1)是讀不到分組的內容的。
import re
print(re.search("a(\d)c","a1c").group(1))
#1
print(re.search("a(?:\d)c","a1c").group(1))
#IndexError: no such group
?
?
\b匹配一個單詞邊界
(?:pattern)匹配pattern但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供以后使用。這在使用或字符“(|)"來組合一個模式的各個部分是很有用。例如"industr(?:y|ies)"就是一個比"industry|industries"更簡略的表達式。
{n}n是一個非負整數。匹配確定的n次。
轉載于:https://www.cnblogs.com/suitcases/p/10830264.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的python进阶(十七)正则json(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SharePoint GridView的
- 下一篇: Python3 OOP(四) 获取对象信