Python正则表达式无法捕获全部时长数据(Python3.6+Scrapy)
解决时长匹配的正则问题
你的问题核心在于网页里Length:后的空格数不一致——短时长对应两个空格,长时长对应一个空格,导致原正则无法兼容两种场景。我来帮你调整正则表达式,同时搞定两种格式的时长捕获。
问题拆解
- 最初的正则
(?<=Length:\s\s)[:\d]+硬绑定了两个空格,自然抓不到仅带一个空格的长时长; - 修改后的
(?<=Length:)[:\d\s]+会把Length:后面的空格也纳入匹配范围,所以优先返回空格而非目标时长。
解决方案
我们可以让正则兼容Length:后1到2个空格的情况,同时精准捕获纯时长内容(数字+冒号的组合)。推荐两种写法:
写法一:精准匹配1-2个空格
适合确定只有1或2个空格的场景:
length_list = re.findall(r'(?<=Length:\s{1,2})[\d:]+', response.text)
写法二:鲁棒匹配任意空白字符
如果网页里可能出现制表符、多个空格等情况,用这个更灵活:
length_list = re.findall(r'(?<=Length:\s+)[:\d]+', response.text)
正则解释
(?<=Length:\s{1,2}):正向后行断言,定位到Length:后跟着1-2个空格的位置;(?<=Length:\s+):更宽松的断言,匹配Length:后至少一个任意空白字符(空格、制表符都算);[\d:]+:匹配连续的数字和冒号,完美覆盖mm:ss和hh:mm:ss两种时长格式。
完整代码示例
import re # 模拟包含两种时长格式的网页文本 response_text = """ <div>Length: 51:00</div> <div>Length: 01:08:47</div> """ data = {} length_list = re.findall(r'(?<=Length:\s+)[:\d]+', response_text) if length_list: data['Length'] = length_list[0] else: data['Length'] = '00:00' print(data['Length']) # 输出第一个匹配到的时长,如需全部可遍历列表
内容的提问来源于stack exchange,提问作者Angel Chen
相关产品推荐
相关产品推荐

