Python正则提取邻近rent与Euro关键词的目标数值的实现方法
租金邻近数值提取的正则匹配修正
匹配需求
- 待处理原始文本:
The apartment is rented out to a student since 2021. The monthly rent is 850 Euro. Additional costs are utilities (150 Euro). - 匹配规则:查找与
rent、Euro两个关键词邻近(字符间隔不超过20个字符,可处于关键词前后任意位置)的数值 - 过滤要求:排除无关年份值2021、附加成本对应数值150,仅提取目标租金值850
原代码的错误原因
原有基于re模块的代码运行后会错误匹配非目标值2021,核心问题如下:
- 间隔阈值设置过松:正则中允许关键词与数值间最多间隔40个字符,远超需求的20字符上限,导致距离较远的2021落入匹配范围
- 缺失单词边界校验:对
rent的匹配没有加单词边界规则,会把包含rent子串的派生词(如rented)直接判定为关键词命中,进一步扩大了无关匹配范围 - 缺少双关键词交叉约束:仅校验数值与
rent的邻近关系,没有结合Euro的邻近校验,无法区分紧邻rent的租金值、和仅紧邻Euro的附加成本150
修正后的可运行代码
import re txt = "The apartment is rented out to a student since 2021. The monthly rent is 850 Euro. Additional costs are utilities (150 Euro)." txt = "".join(txt).strip() # 构建匹配规则:严格控制20字符邻近间隔,仅匹配独立的rent单词 rent_near_pattern = re.compile( r'(?:' r'\b(?i:rent)\b' # 大小写不敏感匹配独立rent单词,排除rented等派生词的干扰 r'[\w€\:\(\)\.\!\?\,\-\\ ]{0,20}' # 相邻字符范围严格限制为20个 r'(\d+[\,\.]?\d*)' # 捕获邻近的数值 r'|' r'(\d+[\,\.]?\d*)' r'[\w€\:\(\)\.\!\?\,\-\\ ]{0,20}' r'\b(?i:rent)\b' r')' ) target_values = [] # 遍历所有匹配到的和rent邻近的数值候选 for match in rent_near_pattern.finditer(txt): # 定位候选数值的位置 if match.group(1): num_str = match.group(1) num_pos = match.start(1) else: num_str = match.group(2) num_pos = match.start(2) # 校验该数值是否和Euro邻近(间隔不超过20字符) window_range = txt[max(0, num_pos - 20): num_pos + 30] if re.search(r'(?i:euro)\b', window_range): # 统一数值格式,替换千分位逗号为点号 target_values.append(num_str.replace(",", ".")) zustand = target_values print(zustand)
运行输出
程序运行后最终输出结果为['850'],完全符合要求:
- 因单词边界规则,
rented不会被判定为关键词,2021不会被纳入候选 - 150虽紧邻Euro,但与
rent的间隔远超20字符,不满足邻近要求被排除 - 850同时满足与rent、Euro的20字符邻近间隔要求,被正确提取
内容的提问来源于stack exchange,提问作者Felix Huber
相关产品推荐
相关产品推荐

