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

如何在Python中按单词而非字符定位专有名词?

问题

需要编写一段Python代码识别地名、人名等专有名词,输出这些单词的单词位置(而非字符位置)。例如输入字符串'Today Sam and Martin are happy',期望输出:

1:Sam
3:Martin

但现有代码输出的是字符索引:

0:Today
6:Sam
14:Martin

现有代码如下:

import re
b=[]
x=str(input())
r =re.compile('([A-Z][a-z]+)')
a=re.findall(r, x) 
a=list(a)
word=len(x.split())
b=[word for word in range(len(x)) if x[word].isupper()]
o=str([j for i in zip(b,a) for j in i])
d=o.replace(", '", ':').replace("",'').replace(",", '\n').replace('[','').replace(']', '').replace(' ', '')
print(d)

请问该如何修复这段代码?

修复方案

原代码核心问题是错误获取了字符索引而非单词位置,同时误匹配了句首的普通大写单词。以下是修正后的实现:

思路

  1. 将输入字符串按空格分割为单词列表,直接关联每个单词的位置。
  2. 遍历单词列表,按需求统计单词位置(示例采用0-based索引)。
  3. 用正则匹配符合专有名词格式的单词(首字母大写、后续为小写字母)。
  4. 过滤掉句首的普通大写单词,输出符合要求的结果。

修正后的代码

import re

# 编译正则:匹配首字母大写、后续至少一个小写字母的单词
pattern = re.compile(r'^[A-Z][a-z]+$')
input_str = input().strip()
# 分割为单词列表
words = input_str.split()

# 遍历单词,记录0-based位置
for idx, word in enumerate(words):
    if pattern.match(word) and idx != 0:
        print(f"{idx}:{word}")

代码说明

  • enumerate(words)直接获取单词的0-based索引,对应示例要求的输出位置。
  • 正则^[A-Z][a-z]+$严格匹配专有名词格式,避免误匹配非目标单词。
  • idx != 0过滤掉句首的普通大写单词(如示例中的Today),如果需要包含句首单词,可删除该判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:25:28