Python正则提取字段时捕获组返回空字符串,如何优化正则模式
问题原因
你的问题出在正则模式的编写逻辑上:
- 你当前的正则使用了3个独立的捕获组配合
|或逻辑进行分支匹配,Python的re.findall方法在检测到正则存在多个捕获组时,会将每一次匹配的所有捕获组结果按顺序组成元组返回 - 由于
|逻辑每次只会触发一个分支的匹配,因此另外两个未触发的捕获组就会返回空字符串,最终出现你看到的多余空元素
修正方案
根据作业要求,分两种场景给出对应正则模式:
场景1:单条字符串一次性提取三个字段,三个捕获组分别对应日期、时间、温度
这种写法匹配整行固定格式的字符串,返回的三元组直接按顺序对应三个字段,无空值:
r'Date: (\d{1,2}/\d{1,2}/\d{4}) Time: (\d{1,2}:\d{1,2} ?[pPaA]\.?[mM]\.?) Temperature: (\d{1,3}\.?\d{0,3} ?[CF])'
调用re.findall返回结果示例:
[('12/31/1999', '11:59 p.m.', '44 F')]
场景2:逐个匹配所有符合要求的字段,返回值为纯字符串列表
这种写法不使用捕获组,re.findall会直接返回所有匹配到的完整内容,无空值:
r'(?<=Date: )\d{1,2}/\d{1,2}/\d{4}|(?<=Time: )\d{1,2}:\d{1,2} ?[pPaA]\.?[mM]\.?|(?<=Temperature: )\d{1,3}\.?\d{0,3} ?[CF]'
调用re.findall返回结果示例:
['12/31/1999', '11:59 p.m.', '44 F']
补充说明
不需要修改调用的匹配函数,只需要调整正则的分组逻辑即可符合要求。
内容的提问来源于stack exchange,提问作者J.Todd
相关产品推荐
相关产品推荐

