python学习——洛谷[NOIP2011 普及组] 统计单词数
[NOIP2011 普及组] 统计单词数
题目描述
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例 1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例 2)。
输入格式
共 2 2 2 行。
第 1 1 1 行为一个字符串,其中只含字母,表示给定单词;
第 2 2 2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式
一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 0 0 0 开始);如果单词在文章中没有出现,则直接输出一个整数 − 1 -1 −1。
注意:空格占一个字母位
样例 #1
样例输入 #1
To
to be or not to be is a question
样例输出 #1
2 0
样例 #2
样例输入 #2
to
Did the Ottoman Empire lose its power at that time
样例输出 #2
-1
提示
数据范围
$1\leq $ 第一行单词长度 ≤ 10 \leq10 ≤10。
$1\leq $ 文章长度 ≤ 1 0 6 \leq10^6 ≤106。
noip2011 普及组第 2 题
AC代码
用pythonre模块
秒了
有几个注意点:不能统计在单词内的,因此用\b匹配单词边界 , 用re.finditer,不用re.search和count计数,代码如下:
import re
to_find = input().lower()
text = input().lower()
to_match = r'\b'+to_find+r'\b'
match = list(re.finditer(to_match, text))
if match:
print(len(match), match[0].start())
else:
print('-1')
以下是代码的逐行解释:
import re # 导入正则表达式模块,用于字符串的匹配操作
导入 re
模块,这个模块提供了正则表达式的功能。
to_find = input().lower() # 读取用户输入的单词,并转换为小写
读取用户输入的第一个字符串,这个字符串是要在文章中查找的单词。使用 lower()
方法将这个单词转换为小写,以便进行不区分大小写的匹配。
text = input().lower() # 读取用户输入的文章,并转换为小写
读取用户输入的第二个字符串,这个字符串是要搜索的文章内容。同样使用 lower()
方法将文章内容转换为小写。
to_match = r'\b'+to_find+r'\b' # 构建正则表达式,确保匹配完整的单词
构建一个正则表达式,用于匹配完整的单词。\b
是一个单词边界断言,确保匹配的是独立的单词,而不是其他单词的一部分。这里将用户输入的单词插入到两个单词边界断言之间。
match = list(re.finditer(to_match, text)) # 使用 re.finditer() 查找所有匹配项
使用 re.finditer()
函数在文章中查找所有匹配正则表达式的子串。这个函数返回一个迭代器,通过 list()
函数将其转换为列表,以便进行进一步的操作。
if match: # 如果匹配列表不为空,说明找到了至少一个匹配项
print(len(match), match[0].start()) # 输出匹配项的数量和第一个匹配项的起始位置
如果 match
列表不为空,说明在文章中找到了至少一个匹配项。len(match)
计算匹配项的数量,match[0].start()
获取第一个匹配项的起始位置,并打印这两个值。
else:
print('-1') # 如果没有找到匹配项,输出 -1
如果 match
列表为空,说明在文章中没有找到匹配项,因此打印 -1
。