@@ -5,15 +5,13 @@ json 模块提供了 python->json 以及 json->python 两种格式,转换规
55
66| JSON -> | Python -> | JSON |
77| -------------- | --------- | -------------- |
8- | object -- 对象 | dict | object -- 对象 |
8+ | object -- 对象 | dict | object -- 对象 |
99| array | list | array |
1010| string | str | string |
1111| number (int) | int | number |
1212| number (real) | float | number |
13- | TRUE | true | |
14- | FALSE | false | |
15- | | TRUE | true |
16- | | FALSE | false |
13+ | true | True | true |
14+ | false | False | false |
1715| null | None | null |
1816| | tuple | array |
1917
@@ -26,7 +24,7 @@ json 模块还有一些其他参数可以控制:编码形式、格式化输出
2624
2725### json.load 与 json.dump
2826
29- json.load 与 json.dump 是基于文件的转换
27+ json.load 与 json.dump 是基于文件的转换。
3028
3129``` python showLineNumbers
3230import json
@@ -54,7 +52,7 @@ with open("data_file.json", "r") as read_content:
5452
5553### json.loads 与 json.dumps
5654
57- json.load 与 json.dump 是直接基于数据的转换
55+ ` json.loads ` 与 ` json.dumps ` 是直接基于数据的转换,这里的 ` s ` 表示 ` string ` (字符串)。
5856
5957``` python showLineNumbers
6058import json
@@ -87,63 +85,59 @@ print(type(res_j)) # <class 'str'>
8785
8886## 概括字符集
8987
90- ## \\ d:表示该位置上的字符是数字,即匹配成功
88+ ### \\ d:表示该位置上的字符是数字,即匹配成功
9189- 等价于[0-9]
92- ## \\ D:表示该位置上的字符不是数字,即匹配成功
90+ ### \\ D:表示该位置上的字符不是数字,即匹配成功
9391- 等价于[^0-9]
94- ## \\ w:表示该位置上的字符是字母或 ,即匹配成功
95- - 等价于[A-Za-z ]
96- ## \\ W:表示该位置上的字符不是是字母或_ ,即匹配成功
97- - 等价于[^A-Za-z_ ]
98- ## \\ s:表示该位置上是不可见字符(空格、制表符\\ t、垂直制表符\\ v、回车符\\ r、换行符\\ n、换页符\\ f),即匹配成功
92+ ### \\ w:使用(flags=re.ASCII)表示该位置上的字符是_或字母、数字 ,即匹配成功
93+ - 等价于[a-zA-Z0-9_ ]
94+ ### \\ W:使用(flags=re.ASCII)表示该位置上的字符不是_或字母、数字 ,即匹配成功
95+ - 等价于[^a-zA-Z0-9_ ]
96+ ### \\ s:表示该位置上是不可见字符(空格、制表符\\ t、垂直制表符\\ v、回车符\\ r、换行符\\ n、换页符\\ f),即匹配成功
9997- 等价于[\\ n\\ t\\ r\\ f\\ v]
100- ## \\ S:表示该位置上不是不可见字符,即匹配成功
98+ ### \\ S:表示该位置上不是不可见字符,即匹配成功
10199
102100## 数量词
103101
104- ## {3}:表示前面的一个字符出现3次
105- ## {3,8}:表示前面的一个字符出现3-8次
106- ## ?:表示前面的一个字符出现0次或1次
107- ## +:表示前面的一个字符出现1次或无限多次
108- ## *:表示前面的一个字符出现0次或无限多次
102+ ### {3}:表示前面的一个字符出现3次
103+ ### {3,8}:表示前面的一个字符出现3-8次
104+ ### ?:表示前面的一个字符出现0次或1次
105+ ### +:表示前面的一个字符出现1次或无限多次
106+ ### *:表示前面的一个字符出现0次或无限多次
109107
110108## 边界匹配符
111109
112- ## ^:表示只要是以后面的字符开头的,即匹配成功
113- ## $:表示只要是以前面的字符结尾的,即匹配成功
114- ## .:表示一个除换行符\n 以外的所有字符
115- ## \\ b:匹配一个单词边界,也就是指单词和空格间的位置。例如,'er\b ' 可以匹配"never"中的'er',但不能匹配"verb" 中的'er'。
116- ## \\ B:匹配非单词边界。'er\B '能匹配"verb"中的er',但不能匹配"never" 中的'er'。
110+ ### ^:表示只要是以后面的字符开头的,即匹配成功
111+ ### $:表示只要是以前面的字符结尾的,即匹配成功
112+ ### .:表示一个除换行符\n 以外的所有字符
113+ ### \\ b:匹配一个单词边界,也就是指单词和空格间的位置。例如,'er\b ' 可以匹配"never"中的'er',但不能匹配"verb" 中的'er'。
114+ ### \\ B:匹配非单词边界。'er\B '能匹配"verb"中的er',但不能匹配"never" 中的'er'。
117115
118116## 元字符
119117
120- ## [a-z]:表示该位置上的字符在a-z之间,即匹配成功
121- ## [^a-z]:表示该位置上的字符不在a-z之间,即匹配成功
122- ## [abf]:表示该位置上的字符为a或者b或者f,即匹配成功
118+ ### [a-z]:表示该位置上的字符在a-z之间,即匹配成功
119+ ### [^a-z]:表示该位置上的字符不在a-z之间,即匹配成功
120+ ### [abf]:表示该位置上的字符为a或者b或者f,即匹配成功
123121- result = re.findall('a[de]c', target)
124122
125123## 修饰符
126124
127- ## re.I:使匹配对大小写不敏感
128- ## re.L:做本地化识别(locale-aware)匹配
129- ## re.M:多行匹配,影响 ^和$
130- ## re.S:使.匹配包括换行在内的所有字符
131- ## re.U:根据Unicode字符集解析字符。这个标志影响\w , \W , \b , \B .
132- ## re.X:该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
125+ ### re.I:使匹配对大小写不敏感
126+ ### re.L:做本地化识别(locale-aware)匹配
127+ ### re.M:多行匹配,影响 ^和$
128+ ### re.S:使.匹配包括换行在内的所有字符
129+ ### re.U:根据Unicode字符集解析字符。这个标志影响\w , \W , \b , \B .
130+ ### re.X:该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
133131
134- ## 匹配所有
132+ ## 匹配
135133
136- ## findall
134+ ### re. findall(pattern, string, flags=0)
137135
138136- 如果匹配到就返回一个列表,没有匹配到就返回空列表。
139137
140- ## finditer
138+ ### re. finditer(pattern, string, flags=0)
141139
142- - 和 findal 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
143-
144- ## 匹配一次
145-
146- ## match
140+ - 和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
147141
148142### re.match(pattern, string, flags=0)
149143
@@ -152,37 +146,31 @@ print(type(res_j)) # <class 'str'>
152146- flags: 标志位,用于控制正则表达式的匹配方式,如是否区分大小写,多行匹配等等。参见:正则表达式修饰符中可选标志
153147- re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None
154148
155- ## search
156-
157- ### re.search(pattern, string, flags=0)
158- - pattern: 匹配的正则表达式
159- - string: 要匹配的字符串
160- - flags: 标志位,用于控制正则表达式的匹配方式,如是否区分大小写,多行匹配等等。参见:正则表达式修饰符中可选标志
161- - re.search匹配整个字符串,直到找到一个匹配。
162149
163150## 组
164151
165- ## (\\ d+)
152+ ### (\\ d+)
166153
167154- ()内的内容构成一个组,只要当前位置满足\d +就匹配成功,返回()内匹配成功的内容
168155
169- ## group(num=0)
156+ ### group(num=0)
170157
171158- 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
172159
173- ## group()
160+ ### group()
174161
175162- 返回一个包含所有小组字符串的元组,从1到 所含的小组号。
176163
177- ## 序列
178-
179- ## str.span()
180-
181- - #返回匹配值的下标,左闭右开
182164
183165## 检索和替换
184166
185- ## re.sub(pattern, repl, string, count=0, flags=0)
167+ ### re.search(pattern, string, flags=0)
168+ - pattern: 匹配的正则表达式
169+ - string: 要匹配的字符串
170+ - flags: 标志位,用于控制正则表达式的匹配方式,如是否区分大小写,多行匹配等等。参见:正则表达式修饰符中可选标志
171+ - re.search匹配整个字符串,直到找到一个匹配。
172+
173+ ### re.sub(pattern, repl, string, count=0, flags=0)
186174
187175- pattern: 正则中的模式字符串。
188176- repl: 替换的字符串,也可为一个函数。
@@ -191,14 +179,14 @@ print(type(res_j)) # <class 'str'>
191179
192180## 编译正则表达式
193181
194- ## re.compile(pattern[, flags])
182+ ### re.compile(pattern[, flags])
195183- pattern: 一个字符串形式的正则表达式
196184- flags: 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:re.I, re.M
197185- compile 函数用于编译正则表达式,生成一个正则表达式(Pattern)对象,供match()和 search() 这两个函数使用。
198186
199187## 正则分割
200188
201- ## re.split(pattern, string[, maxsplit=0, flags=0])
189+ ### re.split(pattern, string[, maxsplit=0, flags=0])
202190
203191- pattern: 正则中的模式字符串。
204192- string: 要匹配的字符串。
@@ -207,9 +195,9 @@ print(type(res_j)) # <class 'str'>
207195
208196## 贪婪和非贪婪
209197
210- ## 贪婪模式就是尽可能多地去匹配字符
198+ ### 贪婪模式就是尽可能多地去匹配字符
211199
212- ## 非贪婪模式就是尽可能少地去匹配字符,python默认采取的是贪婪模式。
200+ ### 非贪婪模式就是尽可能少地去匹配字符,python默认采取的是贪婪模式。
213201
214202` } />
215203
@@ -285,20 +273,26 @@ print(re.sub('(?P<value>\d+)', double, s))
285273# 贪婪与非贪婪
286274content = ' 发布于2018/12/23'
287275result = re.findall(' .*?(\d.*\d)' , content)
288- # 这里的?表示的就是非贪婪模式,第一个.*会尽可能少地去匹配内容,因为后面跟的是\d,所以碰见第一个数字就终止了。
289- print (result)
276+ """
277+ 这里的?表示的就是非贪婪模式,第一个.*会尽可能少地去匹配内容
278+ 因为后面跟的是\d,所以碰见第一个数字就终止了。
279+ """
280+ print (result) # ['2018/12/23']
290281
291282result = re.findall(' .*(\d.*\d)' , content)
292- # 这里的第一个.*后面没有添加问号,表示的就是贪婪模式,第一个.*会尽可能多地去匹配
293- # 内容,后面跟的是\d,碰见第一个数字并不一定会终止,当它匹配到2018的2的时候,发现剩#下的内容依然满足(\d.*\d),所以会一直匹配下去,直到匹配到12后面的/的时候,发现剩下
294- # 的23依然满足(\d.*\d),但是如果再匹配下去,匹配到23的2的话,剩下的3就不满足
295- # (\d.*\d)了,所以第一个.*就会停止匹配,(\d.*\d)最终匹配到的结果就只剩下23了。
296- print (result)
283+ """
284+ 这里的第一个.*后面没有添加问号,表示的就是贪婪模式,第一个.*会尽可能多地去匹配内容
285+ 后面跟的是\d,碰见第一个数字并不一定会终止,当它匹配到2018的2的时候,发现剩#下的内容依然满足(\d.*\d),所以会一直匹配下去
286+ 直到匹配到12后面的/的时候,发现剩下的23依然满足(\d.*\d),但是如果再匹配下去,匹配到23的2的话,剩下的3就不满足(\d.*\d)了
287+ 所以第一个.*就会停止匹配,(\d.*\d)最终匹配到的结果就只剩下23了。
288+ """
289+ print (result) # ['23']
297290
298291result = re.findall(' .*?(\d.*?\d)' , content)
299- # 这里的第一个.*?表示非贪婪模式(非贪婪模式就是尽可能少地去匹配字符),匹配到2018前面的'于'之后就停止了
300- # 括号里的.*?也是表示非贪婪模式,括号里的内容从2018的2开始匹配,因为后面一个数字
301- # 是0,那么也就满足了(\d.*?\d),所以就直接返回结果了,同样的,接下来的18也是这样,一
302- # 直匹配到23才结束
303- print (result)
292+ """
293+ 这里的第一个.*?表示非贪婪模式(非贪婪模式就是尽可能少地去匹配字符),匹配到2018前面的'于'之后就停止了
294+ 括号里的.*?也是表示非贪婪模式,括号里的内容从2018的2开始匹配,因为后面一个数字是0,那么也就满足了(\d.*?\d)
295+ 所以就直接返回结果了,同样的,接下来的18也是这样,一直匹配到23才结束
296+ """
297+ print (result) # ['20', '18', '12', '23']
304298```
0 commit comments