### 8.5 正则模块(re模块)
- findall
```python
ret = re.findall('\d+','liujia123')
#findall会匹配字符串中所有符合规则的项
#并返回一个列表
#如果未匹配到返回的就是一个空列表
```
- search
```python
ret = re.search('\d+','liujia123')
print(ret)
if ret:
print(ret,group())
#会从头到尾从待匹配字符串中取出第一个符合条件的项
#如果匹配到了,就返回一个对象,用group取值
#如果没有匹配到,就返回None,不能用group
```
- match
```python
re = re.match('\d+',"liujia123")
print(ret)
#会从头到尾匹配字符串中第一个字符是否符合规范
#如果符合,就返回对象,用group取值
#如果不符合,就返回None
```
- finditer
```python
ret = re.finditer('\d+','liujia123'*20000) #ret是迭代器
for i in ret: #迭代出来的每一项都是一个对象
print(i.group()) #通过group取值就行
```
- compile
```python
ret = re.compile('\d+') #用compile把正则规则提前绑定到ret中
r1 = ret.reasch('liujia123')
r2 = ret.findall('liujia123')
r3 = ret.finditer('liujia123')
for i in r3:
print(i.group())
```
- 分组
```python
ret = re.split('\d(\d)','liu34jia345')
#默认会保留分组中的内容
ret = re.findall('\d(\d)','aa1alex83')
# findall遇到正则表达式中的分组,会优先显示分组中的内容
print(ret)
```
- sub与subn
```python
ret = re.sun('\d','D','liu578jia56')
#默认替换\d匹配出来的所有数字
ret = re.sun('\d','D','liu578jia56',2)
#后面的数字表示替换几个
ret = re.subn('\d','D','alex83wusir74taibai')
print(ret)
#('alexDDwusirDDtaibai', 4)
#返回结果,并告诉替换了几次
```
- split与字符串中的类似
```python
ret = re.split('\d\d','liu34jia345')
#['liu', 'jia', '5']
ret = re.split('\d(\d)','liu34jia345')
#默认会保留分组中的内容
```
- 取消分组
```python
ret = re.findall('\d(?:\.\d+)?','1.234+2')
print(ret)
#因为有括号,所以会判定优先显示,?:可以取消分组
```
### 8.6 分组的概念与应用
#### 8.6.1 分组的调用
```python
s1 = '<h1>wahaha</h1>'
s2 = '<a>wahaha ya wahaha</a>'
import re
ret = re.search('<(\w+)>(.*?)</\w+>',s1)
print(ret)
print(ret.group(0)) # group参数默认为0 表示取整个正则匹配的结果
print(ret.group(1)) # 取第一个分组中的内容
print(ret.group(2)) # 取第二个分组中的内容
```
#### 8.6.2 分组的命名
```python
s1 = '<h1>wahaha</h1>'
s2 = '<a>wahaha ya wahaha</a>'
import re
ret = ret.search('<(?P<tag>\w+)>(?P<content>.*?</\w+>',s1)
print(ret)
print(ret.group('tag')) # 取tag分组中的内容
print(ret.group('cont')) # 取cont分组中的内容
ret = re.search('<(?P<tag>\w+)>.*?</(?P=tag)>',s1)
print(ret.group('tag'))
(?P=组名) 表示这个组中的内容必须和之前已经存在的一组匹配到的内容完全一致
```
### 8.7 循环实现递归
```python
menu = {
'北京': {
'海淀': {
'五道口': {
'soho': {},
'网易': {},
'google': {}
},
'中关村': {
'爱奇艺': {},
'汽车之家': {},
'youku': {},
},
'上地': {
'百度': {},
},
},
'昌平': {
'沙河': {
'老男孩': {},
'北航': {},
},
'天通苑': {},
'回龙观': {},
},
'朝阳': {},
'东城': {},
},
'上海': {
'闵行': {
"人民广场": {
'炸鸡店': {}
}
},
'闸北': {
'火车战': {
'携程': {}
}
},
'浦东': {},
},
'山东': {},
}
lst = [menu]
while lst:
for key in lst[-1]:
print(key)
inp = input('>>>') # 北京
if inp.upper() == 'Q':break
elif inp.upper() == 'B':lst.pop()
elif lst[-1].get(inp):
lst.append(lst[-1][inp])
```
```python
#使用listdir求文件夹的大小
import os
lst = [r'D:\code']
size = 0
while lst:
path = lst.pop()
name_lst = os.listdir(path)
for name in name_lst:
full_path = os.path.join(path,name)
if os.path.isdir(full_path):
lst.append(full_path)
elif os.path.isfile(full_path):
size += os.path.getsize(full_path)
print(size)
```