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

如何使用re.search()匹配末尾带.或-的完整单词并获取其起止位置

错误原因

你当前的代码无法匹配并抛出Nonetype错误,核心有两个问题:

  1. 正则元字符未转义:你pattern里的.是正则特殊元字符,默认匹配除换行符外的任意单个字符,不会匹配字面量的.符号。
  2. 单词边界\b逻辑不符合需求:\b的判定规则是\w(字母、数字、下划线)与非\w字符的交界位置,你要匹配的in.末尾是.(属于非\w字符),后面跟的空格也属于非\w字符,两者之间不存在\b,因此后缀\b永远无法匹配成功。
修正方案

如果需要匹配前缀为指定内容、末尾为.或-的完整单词,同时支持通过.start()/.end()获取起止位置,可以用以下规则实现:

import re

txt = "The indian in. Spain."
# 你要匹配的单词前缀
word_prefix = "in"
# 构造正则:自动转义前缀的特殊字符 + 匹配末尾.或-
pattern = re.escape(word_prefix) + r"[.-]"

# 匹配规则:前缀为单词边界,后缀不跟单词字符,保证是完整匹配
x = re.search(r"\b" + pattern + r"(?!\w)", txt)

if x:
    print(x.start(), x.end())
    # 输出结果为 11 14,正好对应示例中「in.」的起止位置
规则说明
  • re.escape():自动将前缀中的正则特殊字符转义为字面量,更换其他前缀时也不会出现元字符匹配异常
  • [.-]:匹配末尾的.或-任意一个符号
  • (?!\w):负向先行断言,保证匹配内容的后缀不会跟字母/数字/下划线,替代原逻辑里不合理的\b后缀,完全满足「完整单词」的匹配要求
  • 额外增加if x判断,避免未匹配到时调用方法抛出属性错误

该方案同样适配末尾为-的场景,比如将测试文本改为"The indian in- Spain.",也可正常匹配到in-并返回正确位置。

内容的提问来源于stack exchange,提问作者SMI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:57:00