服务端渲染
客户端渲染
1. requests && urlopen
urllib.request.urlopen(url)
还是 requests.get(url)
取决于具体的需求和上下文。
以下是两者的对比以及如何选择适合自己的工具:
-
易用性和API设计:
requests
:API 设计更加人性化,提供了丰富的高级功能,如会话管理、自动重定向、cookies 处理等。urllib
:API 相对较低级,需要手动处理很多细节。
2. 正则
^
在正则表达式中有两种不同的用途:
-
作为锚点:当
^
位于正则表达式的开始时,它表示匹配字符串的开始位置。也就是说,它确保整个模式从输入字符串的起始位置开始匹配。例如,^abc
只会匹配以"abc"
开头的字符串。 -
在字符集中表示否定:当
^
被放置在方括号[ ]
内部的开头位置时,它表示一个否定的字符集,即匹配不在括号内的任何字符。例如,[^abc]
表示匹配任何不是'a'
、'b'
或'c'
的字符。
正则表达式-数量词
语法示例:x代表字符
1. X? : x出现的数量为 0次或1次
2. X* : x出现的数量为 0次到多次 任意次
3. X+ : x出现的数量为 1次或多次 X>=1次
4. X{n} : x出现的数量为 恰好n次 X=n次
5. X{n,} : x出现的数量为 至少n次 X>=n次 x{3,}
6. X{n,m}: x出现的数量为 n到m次(n和m都是包含的) n=<X<=m
在正则表达式中,.*?
是一种非贪婪(也称为懒惰,lazy)的匹配模式。
.
(点):匹配除换行符之外的任何单个字符。*
(星号):表示前面的字符或模式可以出现零次或多次。?
(问号):当紧跟在*
、+
、{n}
、{n,}
或{n,m}
之后时,表示前面的量词应该尽可能少地匹配字符,即非贪婪匹配。
非贪婪匹配 vs. 贪婪匹配
- 贪婪匹配(默认):默认情况下,量词(如
*
、+
)是贪婪的,意味着它们会尽可能多地匹配字符。例如,在字符串"abc123def"
中,模式.*
会匹配整个字符串"abc123def"
。 - 非贪婪匹配(懒惰):当量词后面加上
?
时,它会尽可能少地匹配字符。例如,在同样的字符串"abc123def"
中,模式.*?
会先尝试匹配零个字符,然后逐渐增加匹配的字符数,直到找到第一个成功的匹配为止。
import re
# 测试文本
text = "我的电话是10086,她的电话是10010"
# findall 返回列表
lst = re.findall(r"\d+", text)
print(lst)
# finditer 返回迭代器
for i in re.finditer(r"\d+", text):
print(i.group())
# search 返回对象 Match object 全文匹配 返回第一个匹配对象
obj = re.search(r"\d+", text)
print(obj.group())
# # match 返回对象 Match object 只匹配开头
# obj = re.match(r"\d+", text)
# print(obj.group())
# 预加载正则表达式
obj = re.compile(r"\d+")
ret = obj.finditer("我有100000000000元")
for i in ret:
print(i.group())
print(obj.findall("我有100000000000元"))