日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python进阶(十七)正则json(上)

發布時間:2023/12/18 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中的listtuple都被轉化成json的數組,而解碼后,json的數組最終轉化為Pythonlist,無論原來是list還是tuple。

2)從jsonPython的類型轉化

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(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。