pysfi 0.1.10__py3-none-any.whl → 0.1.12__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pysfi-0.1.10.dist-info → pysfi-0.1.12.dist-info}/METADATA +9 -7
- pysfi-0.1.12.dist-info/RECORD +62 -0
- {pysfi-0.1.10.dist-info → pysfi-0.1.12.dist-info}/entry_points.txt +13 -2
- sfi/__init__.py +1 -1
- sfi/alarmclock/alarmclock.py +40 -40
- sfi/bumpversion/__init__.py +1 -1
- sfi/cleanbuild/cleanbuild.py +155 -0
- sfi/condasetup/condasetup.py +116 -0
- sfi/docdiff/docdiff.py +238 -0
- sfi/docscan/__init__.py +1 -1
- sfi/docscan/docscan_gui.py +1 -1
- sfi/docscan/lang/eng.py +152 -152
- sfi/docscan/lang/zhcn.py +170 -170
- sfi/filedate/filedate.py +185 -112
- sfi/gittool/__init__.py +2 -0
- sfi/gittool/gittool.py +401 -0
- sfi/llmclient/llmclient.py +592 -0
- sfi/llmquantize/llmquantize.py +480 -0
- sfi/llmserver/llmserver.py +335 -0
- sfi/makepython/makepython.py +2 -2
- sfi/pdfsplit/pdfsplit.py +4 -4
- sfi/pyarchive/pyarchive.py +418 -0
- sfi/pyembedinstall/__init__.py +0 -0
- sfi/pyembedinstall/pyembedinstall.py +629 -0
- sfi/pylibpack/pylibpack.py +813 -269
- sfi/pylibpack/rules/numpy.json +22 -0
- sfi/pylibpack/rules/pymupdf.json +10 -0
- sfi/pylibpack/rules/pyqt5.json +19 -0
- sfi/pylibpack/rules/pyside2.json +23 -0
- sfi/pylibpack/rules/scipy.json +23 -0
- sfi/pylibpack/rules/shiboken2.json +24 -0
- sfi/pyloadergen/pyloadergen.py +271 -572
- sfi/pypack/pypack.py +822 -471
- sfi/pyprojectparse/__init__.py +0 -0
- sfi/pyprojectparse/pyprojectparse.py +500 -0
- sfi/pysourcepack/pysourcepack.py +308 -369
- sfi/quizbase/__init__.py +0 -0
- sfi/quizbase/quizbase.py +828 -0
- sfi/quizbase/quizbase_gui.py +987 -0
- sfi/regexvalidate/__init__.py +0 -0
- sfi/regexvalidate/regex_help.html +284 -0
- sfi/regexvalidate/regexvalidate.py +468 -0
- sfi/taskkill/taskkill.py +0 -2
- pysfi-0.1.10.dist-info/RECORD +0 -39
- sfi/embedinstall/embedinstall.py +0 -478
- sfi/projectparse/projectparse.py +0 -152
- {pysfi-0.1.10.dist-info → pysfi-0.1.12.dist-info}/WHEEL +0 -0
- /sfi/{embedinstall → llmclient}/__init__.py +0 -0
- /sfi/{projectparse → llmquantize}/__init__.py +0 -0
|
File without changes
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Regex Syntax Help</title>
|
|
7
|
+
<style>
|
|
8
|
+
* {
|
|
9
|
+
box-sizing: border-box;
|
|
10
|
+
}
|
|
11
|
+
body {
|
|
12
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Microsoft YaHei', sans-serif;
|
|
13
|
+
font-size: 15px;
|
|
14
|
+
line-height: 1.6;
|
|
15
|
+
margin: 0;
|
|
16
|
+
padding: 0;
|
|
17
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
18
|
+
min-height: 100vh;
|
|
19
|
+
}
|
|
20
|
+
.container {
|
|
21
|
+
max-width: 900px;
|
|
22
|
+
margin: 15px auto;
|
|
23
|
+
background-color: white;
|
|
24
|
+
padding: 12px 16px;
|
|
25
|
+
border-radius: 6px;
|
|
26
|
+
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
|
|
27
|
+
}
|
|
28
|
+
h1 {
|
|
29
|
+
color: #2c3e50;
|
|
30
|
+
font-size: 24px;
|
|
31
|
+
font-weight: 600;
|
|
32
|
+
margin: 0 0 14px 0;
|
|
33
|
+
padding-bottom: 10px;
|
|
34
|
+
border-bottom: 2px solid #667eea;
|
|
35
|
+
display: flex;
|
|
36
|
+
align-items: center;
|
|
37
|
+
gap: 10px;
|
|
38
|
+
}
|
|
39
|
+
h1::before {
|
|
40
|
+
content: "📖";
|
|
41
|
+
font-size: 28px;
|
|
42
|
+
}
|
|
43
|
+
h2 {
|
|
44
|
+
color: #34495e;
|
|
45
|
+
font-size: 17px;
|
|
46
|
+
font-weight: 600;
|
|
47
|
+
margin: 16px 0 10px 0;
|
|
48
|
+
padding: 7px 12px;
|
|
49
|
+
background: linear-gradient(90deg, #f5f7fa 0%, #e8ecf4 100%);
|
|
50
|
+
border-left: 3px solid #667eea;
|
|
51
|
+
border-radius: 3px;
|
|
52
|
+
}
|
|
53
|
+
table {
|
|
54
|
+
width: 100%;
|
|
55
|
+
border-collapse: collapse;
|
|
56
|
+
margin: 10px 0;
|
|
57
|
+
font-size: 14px;
|
|
58
|
+
background: white;
|
|
59
|
+
}
|
|
60
|
+
thead {
|
|
61
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
62
|
+
}
|
|
63
|
+
th {
|
|
64
|
+
color: white;
|
|
65
|
+
text-align: left;
|
|
66
|
+
padding: 10px 12px;
|
|
67
|
+
font-weight: 600;
|
|
68
|
+
font-size: 14px;
|
|
69
|
+
}
|
|
70
|
+
td {
|
|
71
|
+
padding: 8px 12px;
|
|
72
|
+
border: 1px solid #e1e8ed;
|
|
73
|
+
vertical-align: top;
|
|
74
|
+
}
|
|
75
|
+
tbody tr:hover {
|
|
76
|
+
background-color: #f8fafc;
|
|
77
|
+
}
|
|
78
|
+
tbody tr:nth-child(even) {
|
|
79
|
+
background-color: #f8fafc;
|
|
80
|
+
}
|
|
81
|
+
tbody tr:nth-child(even):hover {
|
|
82
|
+
background-color: #e8f0fe;
|
|
83
|
+
}
|
|
84
|
+
code {
|
|
85
|
+
background: linear-gradient(135deg, #ffeaa7 0%, #fdcb6e 100%);
|
|
86
|
+
color: #d35400;
|
|
87
|
+
padding: 3px 8px;
|
|
88
|
+
border-radius: 4px;
|
|
89
|
+
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
|
|
90
|
+
font-size: 13px;
|
|
91
|
+
font-weight: 600;
|
|
92
|
+
}
|
|
93
|
+
.symbol {
|
|
94
|
+
background: linear-gradient(135deg, #74ebd5 0%, #ACB6E5 100%);
|
|
95
|
+
color: #0066cc;
|
|
96
|
+
padding: 4px 10px;
|
|
97
|
+
border-radius: 4px;
|
|
98
|
+
font-weight: 600;
|
|
99
|
+
}
|
|
100
|
+
.desc {
|
|
101
|
+
color: #4a5568;
|
|
102
|
+
}
|
|
103
|
+
.example-code {
|
|
104
|
+
background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%);
|
|
105
|
+
color: #0066cc;
|
|
106
|
+
padding: 3px 8px;
|
|
107
|
+
border-radius: 4px;
|
|
108
|
+
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
|
|
109
|
+
font-weight: 600;
|
|
110
|
+
font-size: 13px;
|
|
111
|
+
}
|
|
112
|
+
ul {
|
|
113
|
+
margin: 10px 0;
|
|
114
|
+
padding-left: 22px;
|
|
115
|
+
}
|
|
116
|
+
li {
|
|
117
|
+
color: #4a5568;
|
|
118
|
+
margin: 5px 0;
|
|
119
|
+
padding-left: 5px;
|
|
120
|
+
}
|
|
121
|
+
li::marker {
|
|
122
|
+
color: #667eea;
|
|
123
|
+
}
|
|
124
|
+
.tip-box {
|
|
125
|
+
background: linear-gradient(135deg, #fff3cd 0%, #ffeaa7 100%);
|
|
126
|
+
padding: 12px 16px;
|
|
127
|
+
border-radius: 5px;
|
|
128
|
+
border-left: 4px solid #f39c12;
|
|
129
|
+
margin: 10px 0;
|
|
130
|
+
}
|
|
131
|
+
.tip-box::before {
|
|
132
|
+
content: "💡";
|
|
133
|
+
font-size: 18px;
|
|
134
|
+
margin-right: 8px;
|
|
135
|
+
}
|
|
136
|
+
@media (prefers-color-scheme: dark) {
|
|
137
|
+
body {
|
|
138
|
+
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
|
|
139
|
+
}
|
|
140
|
+
.container {
|
|
141
|
+
background-color: #1f2937;
|
|
142
|
+
color: #e2e8f0;
|
|
143
|
+
}
|
|
144
|
+
h1 {
|
|
145
|
+
color: #e2e8f0;
|
|
146
|
+
}
|
|
147
|
+
h2 {
|
|
148
|
+
background: linear-gradient(90deg, #374151 0%, #1f2937 100%);
|
|
149
|
+
color: #e2e8f0;
|
|
150
|
+
border-left-color: #60a5fa;
|
|
151
|
+
}
|
|
152
|
+
td {
|
|
153
|
+
border-color: #374151;
|
|
154
|
+
color: #cbd5e1;
|
|
155
|
+
}
|
|
156
|
+
.desc {
|
|
157
|
+
color: #cbd5e1;
|
|
158
|
+
}
|
|
159
|
+
li {
|
|
160
|
+
color: #cbd5e1;
|
|
161
|
+
}
|
|
162
|
+
.tip-box {
|
|
163
|
+
background: linear-gradient(135deg, #4338ca 0%, #6d28d9 100%);
|
|
164
|
+
color: #e2e8f0;
|
|
165
|
+
border-left-color: #8b5cf6;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
</style>
|
|
169
|
+
</head>
|
|
170
|
+
<body>
|
|
171
|
+
<div class="container">
|
|
172
|
+
<h1>正则表达式语法速查</h1>
|
|
173
|
+
|
|
174
|
+
<h2>1. 基本元字符</h2>
|
|
175
|
+
<table>
|
|
176
|
+
<thead>
|
|
177
|
+
<tr>
|
|
178
|
+
<th>符号</th>
|
|
179
|
+
<th>说明</th>
|
|
180
|
+
<th>示例</th>
|
|
181
|
+
</tr>
|
|
182
|
+
</thead>
|
|
183
|
+
<tbody>
|
|
184
|
+
<tr><td><span class="symbol">.</span></td><td class="desc">匹配任意单字符</td><td><code>a.b</code> 匹配 "aXb"</td></tr>
|
|
185
|
+
<tr><td><span class="symbol">^</span></td><td class="desc">匹配字符串开头</td><td><code>^abc</code> 匹配以abc开头</td></tr>
|
|
186
|
+
<tr><td><span class="symbol">$</span></td><td class="desc">匹配字符串结尾</td><td><code>abc$</code> 匹配以abc结尾</td></tr>
|
|
187
|
+
<tr><td><span class="symbol">*</span></td><td class="desc">0次或多次</td><td><code>ab*</code> 匹配 "a", "ab", "abb"...</td></tr>
|
|
188
|
+
<tr><td><span class="symbol">+</span></td><td class="desc">1次或多次</td><td><code>ab+</code> 匹配 "ab", "abb"...</td></tr>
|
|
189
|
+
<tr><td><span class="symbol">?</span></td><td class="desc">0次或1次</td><td><code>ab?</code> 匹配 "a", "ab"</td></tr>
|
|
190
|
+
<tr><td><span class="symbol">{n}</span></td><td class="desc">恰好n次</td><td><code>a{3}</code> 匹配 "aaa"</td></tr>
|
|
191
|
+
<tr><td><span class="symbol">{n,}</span></td><td class="desc">至少n次</td><td><code>a{3,}</code> 匹配 "aaa", "aaaa"...</td></tr>
|
|
192
|
+
<tr><td><span class="symbol">{n,m}</span></td><td class="desc">n到m次</td><td><code>a{2,4}</code> 匹配 "aa", "aaa", "aaaa"</td></tr>
|
|
193
|
+
<tr><td><span class="symbol">[...]</span></td><td class="desc">字符集中任意字符</td><td><code>[abc]</code> 匹配 "a/b/c"</td></tr>
|
|
194
|
+
<tr><td><span class="symbol">[^...]</span></td><td class="desc">不在字符集中</td><td><code>[^abc]</code> 匹配除abc外</td></tr>
|
|
195
|
+
<tr><td><span class="symbol">|</span></td><td class="desc">左边或右边</td><td><code>a|b</code> 匹配 "a" 或 "b"</td></tr>
|
|
196
|
+
<tr><td><span class="symbol">(...)</span></td><td class="desc">捕获分组</td><td><code>(ab)+</code> 匹配 "ab", "abab"</td></tr>
|
|
197
|
+
</tbody>
|
|
198
|
+
</table>
|
|
199
|
+
|
|
200
|
+
<h2>2. 转义字符</h2>
|
|
201
|
+
<table>
|
|
202
|
+
<thead>
|
|
203
|
+
<tr>
|
|
204
|
+
<th>符号</th>
|
|
205
|
+
<th>说明</th>
|
|
206
|
+
<th>示例</th>
|
|
207
|
+
</tr>
|
|
208
|
+
</thead>
|
|
209
|
+
<tbody>
|
|
210
|
+
<tr><td><span class="symbol">\d</span></td><td class="desc">数字[0-9]</td><td><code>\d{3}</code> 匹配 "123"</td></tr>
|
|
211
|
+
<tr><td><span class="symbol">\D</span></td><td class="desc">非数字[^0-9]</td><td><code>\D+</code> 匹配 "abc"</td></tr>
|
|
212
|
+
<tr><td><span class="symbol">\w</span></td><td class="desc">单词字符[a-zA-Z0-9_]</td><td><code>\w+</code> 匹配 "abc123"</td></tr>
|
|
213
|
+
<tr><td><span class="symbol">\W</span></td><td class="desc">非单词字符</td><td><code>\W+</code> 匹配 "!@#"</td></tr>
|
|
214
|
+
<tr><td><span class="symbol">\s</span></td><td class="desc">空白字符</td><td><code>a\sb</code> 匹配 "a b"</td></tr>
|
|
215
|
+
<tr><td><span class="symbol">\S</span></td><td class="desc">非空白字符</td><td><code>\S+</code> 匹配 "abc"</td></tr>
|
|
216
|
+
<tr><td><span class="symbol">\b</span></td><td class="desc">单词边界</td><td><code>\bcat\b</code> 匹配 "cat"</td></tr>
|
|
217
|
+
<tr><td><span class="symbol">\B</span></td><td class="desc">非单词边界</td><td><code>\Bcat\B</code> 匹配 "concatenate"</td></tr>
|
|
218
|
+
<tr><td><span class="symbol">\n</span></td><td class="desc">换行符</td><td>匹配换行</td></tr>
|
|
219
|
+
<tr><td><span class="symbol">\t</span></td><td class="desc">制表符</td><td>匹配制表</td></tr>
|
|
220
|
+
<tr><td><span class="symbol">\\</span></td><td class="desc">反斜杠本身</td><td><code>\\</code> 匹配 "\"</td></tr>
|
|
221
|
+
</tbody>
|
|
222
|
+
</table>
|
|
223
|
+
|
|
224
|
+
<h2>3. 正则标志</h2>
|
|
225
|
+
<table>
|
|
226
|
+
<thead>
|
|
227
|
+
<tr>
|
|
228
|
+
<th>标志</th>
|
|
229
|
+
<th>说明</th>
|
|
230
|
+
</tr>
|
|
231
|
+
</thead>
|
|
232
|
+
<tbody>
|
|
233
|
+
<tr><td><span class="symbol">re.IGNORECASE</span></td><td class="desc">忽略大小写</td></tr>
|
|
234
|
+
<tr><td><span class="symbol">re.MULTILINE</span></td><td class="desc">^和$匹配每行</td></tr>
|
|
235
|
+
<tr><td><span class="symbol">re.DOTALL</span></td><td class="desc">.匹配含换行符</td></tr>
|
|
236
|
+
</tbody>
|
|
237
|
+
</table>
|
|
238
|
+
|
|
239
|
+
<h2>4. 常用示例</h2>
|
|
240
|
+
<table>
|
|
241
|
+
<thead>
|
|
242
|
+
<tr>
|
|
243
|
+
<th>目的</th>
|
|
244
|
+
<th>正则表达式</th>
|
|
245
|
+
<th>示例</th>
|
|
246
|
+
</tr>
|
|
247
|
+
</thead>
|
|
248
|
+
<tbody>
|
|
249
|
+
<tr><td class="desc">邮箱</td><td class="example-code">[\w.+-]+@[\w-]+\.[\w.-]+</td><td>test@example.com</td></tr>
|
|
250
|
+
<tr><td class="desc">手机号(中国)</td><td class="example-code">1[3-9]\d{9}</td><td>13812345678</td></tr>
|
|
251
|
+
<tr><td class="desc">日期 YYYY-MM-DD</td><td class="example-code">\d{4}-\d{2}-\d{2}</td><td>2024-01-22</td></tr>
|
|
252
|
+
<tr><td class="desc">IP地址</td><td class="example-code">\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}</td><td>192.168.1.1</td></tr>
|
|
253
|
+
<tr><td class="desc">URL</td><td class="example-code">https?://[\w.-]+\.[\w./-?=%&]+</td><td>https://example.com</td></tr>
|
|
254
|
+
<tr><td class="desc">十六进制颜色</td><td class="example-code">#[0-9a-fA-F]{6}</td><td>#ff0000</td></tr>
|
|
255
|
+
<tr><td class="desc">整数</td><td class="example-code">\d+</code></td><td>12345</td></tr>
|
|
256
|
+
<tr><td class="desc">浮点数</td><td class="example-code">\d+\.\d+</td><td>3.14159</td></tr>
|
|
257
|
+
</tbody>
|
|
258
|
+
</table>
|
|
259
|
+
|
|
260
|
+
<h2>5. 分组与引用</h2>
|
|
261
|
+
<table>
|
|
262
|
+
<thead>
|
|
263
|
+
<tr>
|
|
264
|
+
<th>语法</th>
|
|
265
|
+
<th>说明</th>
|
|
266
|
+
<th>示例</th>
|
|
267
|
+
</tr>
|
|
268
|
+
</thead>
|
|
269
|
+
<tbody>
|
|
270
|
+
<tr><td><span class="symbol">(...)</span></td><td class="desc">捕获分组</td><td><code>(\d{2})-(\d{2})</code> 匹配 "12-34"</td></tr>
|
|
271
|
+
<tr><td><span class="symbol">(?:...)</span></td><td class="desc">非捕获分组</td><td><code>(?:ab)+</code> 匹配 "abab"</td></tr>
|
|
272
|
+
<tr><td><span class="symbol">(?P<name>...)</span></td><td class="desc">命名分组</td><td><code>(?P<year>\d{4})</code></td></tr>
|
|
273
|
+
<tr><td><span class="symbol">\1, \2</span></td><td class="desc">引用前面分组</td><td><code>(\d)\1</code> 匹配 "11", "22"</td></tr>
|
|
274
|
+
<tr><td><span class="symbol">(?=...)</span></td><td class="desc">正向预查</td><td><code>a(?=b)</code> 匹配 "ab"中"a"</td></tr>
|
|
275
|
+
<tr><td><span class="symbol">(?!...)</span></td><td class="desc">负向预查</td><td><code>a(?!b)</code> 匹配 "ac"中"a"</td></tr>
|
|
276
|
+
</tbody>
|
|
277
|
+
</table>
|
|
278
|
+
|
|
279
|
+
<div class="tip-box">
|
|
280
|
+
<strong>💡 提示:</strong>Raw Mode启用时,正则字符串按原样处理;禁用时需注意Python转义。建议使用原始字符串 r"..." 编写正则表达式。
|
|
281
|
+
</div>
|
|
282
|
+
</div>
|
|
283
|
+
</body>
|
|
284
|
+
</html>
|