如何在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)
请问该如何修复这段代码?
修复方案
原代码核心问题是错误获取了字符索引而非单词位置,同时误匹配了句首的普通大写单词。以下是修正后的实现:
思路
- 将输入字符串按空格分割为单词列表,直接关联每个单词的位置。
- 遍历单词列表,按需求统计单词位置(示例采用0-based索引)。
- 用正则匹配符合专有名词格式的单词(首字母大写、后续为小写字母)。
- 过滤掉句首的普通大写单词,输出符合要求的结果。
修正后的代码
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
相关产品推荐
相关产品推荐

