正则表达式匹配结果中的分组提取问题咨询
提取正则匹配的分组内容
嘿,你已经搞定了正则的匹配逻辑,要提取分组内容其实超简单,咱们直接看具体操作:
1. 先确认匹配是否成功
首先要注意,re.match()如果没匹配到内容会返回None,所以先加个判断避免报错:
import regex as re input_example = "Today at 12:30 PM on Rakesh's Echo" regexp_1 = re.compile(r'(\w+) at (\d+):(\d+) (\w+) on (\w+)') re_match = regexp_1.match(input_example) # 先判断是否匹配成功 if re_match: # 这里写提取逻辑 pass
2. 两种提取分组的方式
方式一:用group()按索引提取
每个括号里的分组对应一个索引,从1开始(group(0)是整个匹配的完整字符串):
if re_match: day = re_match.group(1) # 对应 [Day] 部分,比如示例里的 "Today" hour = re_match.group(2) # 时间的小时部分,比如示例里的 "12" minute = re_match.group(3) # 时间的分钟部分,比如示例里的 "30" period = re_match.group(4) # 上午/下午标识,比如示例里的 "PM" location = re_match.group(5) # 对应 [location] 部分 # 打印验证结果 print(f"Day: {day}") print(f"Full Time: {hour}:{minute} {period}") print(f"Location: {location}")
方式二:用groups()一次性获取所有分组
这个方法会返回一个包含所有分组内容的元组,可以直接解包给变量,代码更简洁:
if re_match: day, hour, minute, period, location = re_match.groups() # 直接使用这些变量即可 print(f"匹配结果:{day} at {hour}:{minute} {period} on {location}")
小提示:优化正则匹配范围
你当前的正则最后一个分组(\w+)只能匹配字母、数字和下划线,像示例里的"Rakesh's Echo"或者"Sam's living room"这种带撇号、空格的位置会匹配不全(只能拿到"Rakesh")。如果要支持这类场景,可以把最后一个分组改成([\w'\s]+),这样就能匹配包含撇号和空格的位置了:
regexp_1 = re.compile(r'(\w+) at (\d+):(\d+) (\w+) on ([\w\'\s]+)')
内容的提问来源于stack exchange,提问作者Rakesh Adhikesavan
相关产品推荐
相关产品推荐

