python正则表示式学习笔记(一)
今日遇到的问题
r'(user:|assistant:)(.*?)(?=user:|assistant:|$)'
(.*?)
- 这是一个非贪婪匹配的分组,用于匹配发言者之后的文本内容,直到遇到下一个发言者或者达到字符串结尾
.*?
.
表示匹配任意字符(除了换行符)*
表示匹配前面的任意字符零次或多次?
使匹配变为非贪婪模式,即尽可能少地匹配字符,直到遇到下一个发言者标识或字符串结束
(?=user:|assistant:|$)
- 这是一个正向前瞻断言,用于确保在匹配到发言者内容之后,下一个字符序列应该是"user:"或"assistant:"或者字符串结尾$
- 正向前瞻不会消耗字符,只是进行检查。也就是说,它不会将匹配到的内容包含在最终的匹配结果中,但它会影响匹配的成功与否。
- 这个前瞻断言确保了提取的内容是当前发言者的发言,而不是跨越发言者
- 非贪婪匹配是指最短满足目标正则表达式的字符串
- 贪婪匹配是指最长满足目标正则表达式的字符串
- 正向前瞻断言的语法是
(?=...)
,其中...
是你想要匹配的模式(即正则表达式) re.findall
用于查找所有匹配正则表达式的子串,并返回一个包含所有匹配项的列表。如果正则表达式中有多个捕获组(即使用括号分组),则返回的列表中每个元素将是一个包含捕获组内容的元组。re.search
则用于查找字符串中第一次匹配正则表达式的位置,并返回一个匹配对象。如果没有找到匹配,则返回None。这个对象包含了匹配的详细信息,比如匹配的开始和结束位置,以及匹配的文本内容。如果需要获取整个匹配的内容,可以使用match.group()方法。import re text = "Hello, my email is example@example.com" pattern = r'(\w+@\w+\.\w+)' match = re.search(pattern, text) if match: print("找到匹配项:", match.group()) print("开始位置:", match.start()) print("结束位置:",match.end()) else: print("未找到匹配项")