Error in user YAML: (<unknown>): could not find expected ':' while scanning a simple key at line 3 column 1
---
- oeasy Python 0481
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
本教程同步发布在:
个人网站: `https://oeasy.org`
蓝桥云课: `https://www.lanqiao.cn/courses/3584`
GitHub: `https://github.com/overmind1980/oeasy-python-tutorial`
Gitee: `https://gitee.com/overmind1980/oeasypython`
---- 上次了解了三个re的函数
- search
- findall
- finditer
- 三个元字符
.任意非换行字符^匹配 开头位置$匹配结束位置
- 这开始和结束
- 刚好和vim跳转一致
- 你说巧不巧
- 还有什么 元字符 呢?
-
贪婪匹配
-
- 可能匹配着尽可能多的字符
-
-
这如何理解?
import re
text = "cab celebrate banana abort"
pattern = r"a.*b"
matches = re.findall(pattern, text)
print(matches)
- 结果
- .* 由于使用了贪婪匹配
- 贪到了 足够多的字符
- 总共就一个匹配
- 如何理解greedy呢?
- 因为hungry
- 所以想吃的多 greedy
- 可以设置为非贪婪吗?
- 如果*是贪婪的
- *?就是非贪婪的
- 尝试修改代码
- 非贪婪后
- 确实不止一个了
- 除了*?之外
- +? 和 ??是什么意思呢?
-
- 匹配着0到任意多个字符
-
- 匹配着1到任意多个字符
- 具体代码如何?
- 结果
- 理解
- 可以非贪婪吗?
- 结果
- 不包含cab中的ab
- 因为+至少一个字符
- 是什么意思呢?
- a.?b代表
- a和b之间有0个或1个字符
- 具体应用呢?
- 结果
- abb入选
- 说明目前是贪婪模式
- 改成非贪婪模式后
- ab入选
- 而不是abb
- 还有什么关于字符数量的描述吗?
- 大括号{}
- {m,n}
- 从m到n个重复 贪婪
- {m,n}?
- 从m到n个重复 非贪婪
- {m,n}
- m、n都包括吗?
- .{0,3}
- 0-3个任意字符
- 如何匹配0个重复的ab呢?
- 使用非贪婪后
- 可以匹配ab
- {0,3}中可以省略0吗?
- 省略0后
- 效果不变
- 说明前面的0可以省略
- 可以省略后面的3吗?
- 结果改变
- {,3} 0到3个重复
- {,} 0到任意多个重复
- 就是*
| 符号 | 对应关系 |
|---|---|
| * | {,} |
| + | {1,} |
| ? | {0,1} |
- 以上为贪婪匹配
| 符号 | 对应关系 |
|---|---|
| *? | {,}? |
| +? | {1,}? |
| ?? | {0,1}? |
- 以上为非贪婪匹配
wget https://labfile.shiyanlou.com/courses/3584/novels.zip
unzip novels.zip
- 下载并解压zip
- 红楼梦对话长度
import re
from collections import defaultdict
def analyze_dialogues(filename):
with open(filename, 'r', encoding='utf-8') as f:
content = f.read()
# 提取对话(假设对话在引号内)
dialogues = re.findall('“([^"]*)”', content)
# 统计对话长度
dialogue_lengths = defaultdict(list)
for d in dialogues:
length = len(d)
if 0 < length <= 10:
dialogue_lengths['短对话'].append(d)
elif 10 < length <= 30:
dialogue_lengths['中等对话'].append(d)
else:
dialogue_lengths['长对话'].append(d)
print(len(dialogues))
# 输出统计结果
for category, items in dialogue_lengths.items():
#print(f"\n{category}数量: {len(items)}")
#print(f"示例: {items[:3]}")
print()
# 使用示例
analyze_dialogues('hlm.txt')
- 贪婪会出问题
import re
from collections import defaultdict
def analyze_dialogues(filename):
with open(filename, 'r', encoding='utf-8') as f:
content = f.read()
# 提取对话(假设对话在引号内)
dialogues = re.findall('“(.*?)”', content)
# 统计对话长度
dialogue_lengths = defaultdict(list)
for d in dialogues:
length = len(d)
if 0 < length <= 10:
dialogue_lengths['短对话'].append(d)
elif 10 < length <= 30:
dialogue_lengths['中等对话'].append(d)
else:
dialogue_lengths['长对话'].append(d)
print(len(dialogues))
# 输出统计结果
for category, items in dialogue_lengths.items():
print(f"\n{category}数量: {len(items)}")
print(f"示例: {items[:3]}")
# 使用示例
analyze_dialogues('hlm.txt')
- 这次了解了正则表达式的重复次数
- {m,n} 重复m到n次
-
- 零到任意多次
-
- 一到任意多次
- ? 零次或一次
- 还了解了 贪婪和 非贪婪
- 贪婪匹配 尽可能多的字符
- 非贪婪匹配 尽可能少的字符 后面加?
- 正则表达式还有什么可以研究的呢?🤔
- 下次再说👋🏻
- 本文来自 oeasy Python 系统教程。
- 想完整、扎实学 Python,
- 搜索 oeasy 即可。



























