You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 08:45:03