Skip to content

Commit 85805f2

Browse files
committed
s
1 parent a7e9141 commit 85805f2

112 files changed

Lines changed: 841 additions & 29 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

feature.md

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -118,31 +118,32 @@
118118
| 83 | [10个高斯分布的坐标点](md/83.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️⭐️ |
119119
| 84 | [chain串联小容器为大容器](md/84.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️⭐️⭐️ |
120120
| 85 | [product 使用案例](md/85.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️⭐️⭐️ |
121-
| 86 | [反转字符串的两个方法](md/86.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
122-
| 87 | [join 串联字符串](md/87.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
123-
| 88 | [字符串字节长度](md/88.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
121+
| 86 | [反转字符串的两个方法](md/86.md) | V1.0 | jackzhenguo | ⭐️⭐️ |
122+
| 87 | [join 串联字符串](md/87.md) | V1.0 | jackzhenguo | ⭐️⭐️ |
123+
| 88 | [字符串字节长度](md/88.md) | V1.0 | jackzhenguo | ⭐️⭐️ |
124124
| 89 | [正则中字符 `r`作用](md/89.md) | V3.0 | jackzhenguo | ⭐️⭐️⭐️ |
125125
| 90 | [正则原子操作](md/90.md) | V3.0 | jackzhenguo | ⭐️⭐️⭐️ |
126-
| 91 | [正则中的转义](md/91.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
127-
| 92 | [Topn 字典](md/92.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
128-
| 93 | [Topn 字典](md/93.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
129-
| 94 | [Topn 字典](md/94.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
130-
| 95 | [Topn 字典](md/95.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
131-
| 96 | [Topn 字典](md/96.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
132-
| 97 | [Topn 字典](md/97.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
133-
| 98 | [Topn 字典](md/98.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
134-
| 99 | [Topn 字典](md/99.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
135-
| 100 | [Topn 字典](md/100.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
136-
| 101 | [Topn 字典](md/101.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
137-
| 102 | [Topn 字典](md/102.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
138-
| 103 | [Topn 字典](md/103.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
139-
| 104 | [Topn 字典](md/104.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
140-
| 105 | [Topn 字典](md/105.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
141-
| 106 | [Topn 字典](md/106.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
142-
| 107 | [Topn 字典](md/107.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
143-
| 108 | [Topn 字典](md/108.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
144-
| 109 | [Topn 字典](md/109.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
145-
| 110 | [Topn 字典](md/110.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
146-
| 111 | [Topn 字典](md/111.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
147-
| 112 | [Topn 字典](md/112.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
148-
| 113 | [Topn 字典](md/113.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
126+
| 91 | [正则中的转义](md/91.md) | V3.0 | jackzhenguo | ⭐️⭐️⭐️ |
127+
| 92 | [正则最普通查找](md/92.md) | V3.0 | jackzhenguo | ⭐️⭐️⭐️ |
128+
| 93 | [使用通用字符查找](md/93.md) | V3.0 | jackzhenguo | ⭐️⭐️⭐️ |
129+
| 94 | [使用元字符查找](md/94.md) | V3.0 | jackzhenguo | ⭐️⭐️⭐️ |
130+
| 95 | [捕获子串](md/95.md) | V3.0 | jackzhenguo | ⭐️⭐️⭐️⭐️ |
131+
| 96 | [贪心捕获和非贪心捕获](md/96.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️⭐️ |
132+
| 97 | [使用正则做密码安全检查](md/97.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️⭐️⭐️ |
133+
| 98 | [爬取百度首页标题](md/98.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️⭐️ |
134+
| 99 | [批量转化为驼峰格式(Camel)](md/99.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️⭐️⭐️ |
135+
| 100 | [是否互为排序词](md/100.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️⭐️ |
136+
| 101 | [str1是否由str2旋转而来](md/101.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
137+
| 102 | [使用正则判断是否为正浮点数](md/102.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️⭐️⭐️ |
138+
| 103 | [获取文件后缀名](md/103.md) | V1.0 | jackzhenguo | ⭐️⭐️ |
139+
| 104 | [获取路径中的文件名](md/104.md) | V1.0 | jackzhenguo | ⭐️⭐️ |
140+
| 105 | [批量修改文件后缀](md/105.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️⭐️ |
141+
| 106 | [xls批量转换成xlsx](md/106.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️⭐️ |
142+
| 107 | [获取指定后缀名的文件](md/107.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️⭐️ |
143+
| 108 | [批量压缩文件](md/108.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️⭐️ |
144+
| 109 | [32位加密](md/109.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️⭐️ |
145+
| 110 | [年的日历图](md/110.md) | V1.0 | jackzhenguo | ⭐️⭐️ |
146+
| 111 | [判断是否为闰年](md/111.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
147+
| 112 | [判断月有几天](md/112.md) | V1.0 | jackzhenguo | ⭐️⭐️⭐️ |
148+
| 113 | [月的第一天](md/113.md) | V1.0 | jackzhenguo | ⭐️⭐️ |
149+
| 114 | [月的最后一天](md/114.md) | V1.0 | jackzhenguo | ⭐️⭐️ |

md/100.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#### 100 是否互为排序词
2+
3+
排序词(permutation):两个字符串含有相同字符,但字符顺序不同。
4+
5+
```python
6+
from collections import defaultdict
7+
8+
9+
def is_permutation(str1, str2):
10+
if str1 is None or str2 is None:
11+
return False
12+
if len(str1) != len(str2):
13+
return False
14+
unq_s1 = defaultdict(int)
15+
unq_s2 = defaultdict(int)
16+
for c1 in str1:
17+
unq_s1[c1] += 1
18+
for c2 in str2:
19+
unq_s2[c2] += 1
20+
21+
return unq_s1 == unq_s2
22+
```
23+
24+
这个小例子,使用python内置的`defaultdict`,默认类型初始化为`int`,计数默次数都为0. 这个解法本质是 `hash map lookup`
25+
26+
统计出的两个defaultdict:unq_s1,unq_s2,如果相等,就表明str1、 str2互为排序词。
27+
28+
下面测试:
29+
30+
```python
31+
r = is_permutation('nice', 'cine')
32+
print(r) # True
33+
34+
r = is_permutation('', '')
35+
print(r) # True
36+
37+
r = is_permutation('', None)
38+
print(r) # False
39+
40+
r = is_permutation('work', 'woo')
41+
print(r) # False
42+
43+
```

md/101.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#### 101 str1是否由str2旋转而来
2+
3+
`stringbook`旋转后得到`bookstring`,写一段代码验证`str1`是否为`str2`旋转得到。
4+
5+
**思路**
6+
7+
转化为判断:`str1`是否为`str2+str2`的子串
8+
9+
```python
10+
def is_rotation(s1: str, s2: str) -> bool:
11+
if s1 is None or s2 is None:
12+
return False
13+
if len(s1) != len(s2):
14+
return False
15+
16+
def is_substring(s1: str, s2: str) -> bool:
17+
return s1 in s2
18+
return is_substring(s1, s2 + s2)
19+
```
20+
21+
**测试**
22+
23+
```python
24+
r = is_rotation('stringbook', 'bookstring')
25+
print(r) # True
26+
27+
r = is_rotation('greatman', 'maneatgr')
28+
print(r) # False
29+
```

md/102.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#### 102 使用正则判断是否为正浮点数
2+
3+
从一系列字符串中,挑选出所有正浮点数。
4+
5+
该怎么办?
6+
7+
玩玩正则表达式,用正则搞它!
8+
9+
关键是,正则表达式该怎么写呢?
10+
11+
有了!
12+
13+
`^[1-9]\d*\.\d*$`
14+
15+
`^` 表示字符串开始
16+
17+
`[1-9]` 表示数字1,2,3,4,5,6,7,8,9
18+
19+
`^[1-9]` 连起来表示以数字 `1-9` 作为开头
20+
21+
`\d` 表示一位 `0-9` 的数字
22+
23+
`*` 表示前一位字符出现 0 次,1 次或多次
24+
25+
`\d*` 表示数字出现 0 次,1 次或多次
26+
27+
`\.` 表示小数点
28+
29+
`\$` 表示字符串以前一位的字符结束
30+
31+
`^[1-9]\d*\.\d*$` 连起来就求出所有大于 1.0 的正浮点数。
32+
33+
那 0.0 到 1.0 之间的正浮点数,怎么求,干嘛不直接汇总到上面的正则表达式中呢?
34+
35+
这样写不行吗:`^[0-9]\d*\.\d*$`
36+
37+
```python
38+
In [85]: import re
39+
40+
In [87]: recom = re.compile(r'^[0-9]\d*\.\d*$')
41+
42+
In [88]: recom.match('000.2')
43+
Out[88]: <re.Match object; span=(0, 5), match='000.2'>
44+
```
45+
46+
结果显示,正则表达式 `^[0-9]\d*\.\d*$` 竟然匹配到 `000.2 `,认为它是一个正浮点数。
47+
48+
所以知道为啥要先匹配大于 1.0 的浮点数了吧!
49+
50+
如果能写出这个正则表达式,再写另一部分就不困难了!
51+
52+
0.0 到 1.0 间的浮点数:`^0\.\d*[1-9]\d*$`
53+
54+
两个式子连接起来就是最终的结果:
55+
56+
`^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$`

md/103.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#### 103 获取后缀名
2+
3+
```python
4+
import os
5+
file_ext = os.path.splitext('./data/py/test.py')
6+
front,ext = file_ext
7+
In [5]: front
8+
Out[5]: './data/py/test'
9+
10+
In [6]: ext
11+
Out[6]: '.py'
12+
```

md/104.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#### 104 获取路径中的文件名
2+
3+
```python
4+
In [11]: import os
5+
...: file_ext = os.path.split('./data/py/test.py')
6+
...: ipath,ifile = file_ext
7+
...:
8+
9+
In [12]: ipath
10+
Out[12]: './data/py'
11+
12+
In [13]: ifile
13+
Out[13]: 'test.py'
14+
```

md/105.md

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#### 105 批量修改文件后缀
2+
3+
**批量修改文件后缀**
4+
5+
本例子使用Python的`os`模块和 `argparse`模块,将工作目录`work_dir`下所有后缀名为`old_ext`的文件修改为后缀名为`new_ext`
6+
7+
通过本例子,大家将会大概清楚`argparse`模块的主要用法。
8+
9+
导入模块
10+
11+
```python
12+
import argparse
13+
import os
14+
```
15+
16+
定义脚本参数
17+
18+
```python
19+
def get_parser():
20+
parser = argparse.ArgumentParser(
21+
description='工作目录中文件后缀名修改')
22+
parser.add_argument('work_dir', metavar='WORK_DIR', type=str, nargs=1,
23+
help='修改后缀名的文件目录')
24+
parser.add_argument('old_ext', metavar='OLD_EXT',
25+
type=str, nargs=1, help='原来的后缀')
26+
parser.add_argument('new_ext', metavar='NEW_EXT',
27+
type=str, nargs=1, help='新的后缀')
28+
return parser
29+
```
30+
31+
后缀名批量修改
32+
33+
```python
34+
def batch_rename(work_dir, old_ext, new_ext):
35+
"""
36+
传递当前目录,原来后缀名,新的后缀名后,批量重命名后缀
37+
"""
38+
for filename in os.listdir(work_dir):
39+
# 获取得到文件后缀
40+
split_file = os.path.splitext(filename)
41+
file_ext = split_file[1]
42+
# 定位后缀名为old_ext 的文件
43+
if old_ext == file_ext:
44+
# 修改后文件的完整名称
45+
newfile = split_file[0] + new_ext
46+
# 实现重命名操作
47+
os.rename(
48+
os.path.join(work_dir, filename),
49+
os.path.join(work_dir, newfile)
50+
)
51+
print("完成重命名")
52+
print(os.listdir(work_dir))
53+
```
54+
55+
实现Main
56+
57+
```python
58+
def main():
59+
"""
60+
main函数
61+
"""
62+
# 命令行参数
63+
parser = get_parser()
64+
args = vars(parser.parse_args())
65+
# 从命令行参数中依次解析出参数
66+
work_dir = args['work_dir'][0]
67+
old_ext = args['old_ext'][0]
68+
if old_ext[0] != '.':
69+
old_ext = '.' + old_ext
70+
new_ext = args['new_ext'][0]
71+
if new_ext[0] != '.':
72+
new_ext = '.' + new_ext
73+
74+
batch_rename(work_dir, old_ext, new_ext)
75+
```

md/106.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#### 106 xls批量转换成xlsx
2+
3+
```python
4+
import os
5+
6+
7+
def xls_to_xlsx(work_dir):
8+
"""
9+
传递当前目录,原来后缀名,新的后缀名后,批量重命名后缀
10+
"""
11+
old_ext, new_ext = '.xls', '.xlsx'
12+
for filename in os.listdir(work_dir):
13+
# 获取得到文件后缀
14+
split_file = os.path.splitext(filename)
15+
file_ext = split_file[1]
16+
# 定位后缀名为old_ext 的文件
17+
if old_ext == file_ext:
18+
# 修改后文件的完整名称
19+
newfile = split_file[0] + new_ext
20+
# 实现重命名操作
21+
os.rename(
22+
os.path.join(work_dir, filename),
23+
os.path.join(work_dir, newfile)
24+
)
25+
print("完成重命名")
26+
print(os.listdir(work_dir))
27+
28+
29+
xls_to_xlsx('./data')
30+
31+
# 输出结果:
32+
# ['cut_words.csv', 'email_list.xlsx', 'email_test.docx', 'email_test.jpg', 'email_test.xlsx', 'geo_data.png', 'geo_data.xlsx',
33+
'iotest.txt', 'pyside2.md', 'PySimpleGUI-4.7.1-py3-none-any.whl', 'test.txt', 'test_excel.xlsx', 'ziptest', 'ziptest.zip']
34+
```

md/107.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#### 107 获取指定后缀名的文件
2+
3+
```python
4+
import os
5+
6+
def find_file(work_dir,extension='jpg'):
7+
lst = []
8+
for filename in os.listdir(work_dir):
9+
print(filename)
10+
splits = os.path.splitext(filename)
11+
ext = splits[1] # 拿到扩展名
12+
if ext == '.'+extension:
13+
lst.append(filename)
14+
return lst
15+
16+
r = find_file('.','md')
17+
print(r) # 返回所有目录下的md文件
18+
```

md/108.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#### 108 批量压缩文件
2+
3+
4+
```python
5+
import zipfile # 导入zipfile,这个是用来做压缩和解压的Python模块;
6+
import os
7+
import time
8+
9+
10+
def batch_zip(start_dir):
11+
start_dir = start_dir # 要压缩的文件夹路径
12+
file_news = start_dir + '.zip' # 压缩后文件夹的名字
13+
14+
z = zipfile.ZipFile(file_news, 'w', zipfile.ZIP_DEFLATED)
15+
for dir_path, dir_names, file_names in os.walk(start_dir):
16+
# 这一句很重要,不replace的话,就从根目录开始复制
17+
f_path = dir_path.replace(start_dir, '')
18+
f_path = f_path and f_path + os.sep # 实现当前文件夹以及包含的所有文件的压缩
19+
for filename in file_names:
20+
z.write(os.path.join(dir_path, filename), f_path + filename)
21+
z.close()
22+
return file_news
23+
24+
25+
batch_zip('./data/ziptest')
26+
27+
28+
```

0 commit comments

Comments
 (0)