蓝桥楼赛第23期-解析用户名字符串
题目描述
在社交和即时通讯应用中,@ 字符通常用于提醒某人。例如,你在楼赛取得了好成绩,拿了奖品,激动地发送了一条微博并 @实验楼官方微博。本次挑战中,我们希望实现一个函数,能够自动提取出任意文本内容中 @ 字符后面的用户名,这对于日常使用 Python 分析社交媒体文本内容很有帮助。
补充 after_at(text) 函数中的 TODO 部分,使其实现我们需要的功能:
- 返回一段指定文本 text 中任意 @ 字符后续的正确用户名。
- 正确的用户名由连续中文字符、下划线和英文字母组成,不包含标点符号、空格和其他特殊字符。
要求
题目需使用 Python 3.6 完成,不能使用标准库 和 第三方库。
函数传入 text 为字符串类型,可能为空。
函数返回列表,且应按 text 字符串中的出现的正确用户名次数降序排列,次数相等无先后顺序,且不重复。
示例
示例 1:
1
2text = "@实验楼 @shiyanlou 我在 @ 楼赛中中奖啦";
usernames = ['实验楼', 'shiyanlou']示例 2:
1
2text = "@实验楼@shiyanlou 我在 @ 楼赛中中奖啦";
usernames = ['实验楼', 'shiyanlou']示例 3:
1
text = "@shiyanlou @实验楼 我在 @实验楼 楼赛中中奖啦"; usernames = ['实验楼', 'shiyanlou']
示例 4:
1
2text = "@!实验楼 @shiyanlou 我在楼赛中中奖啦";
usernames = ['shiyanlou']示例 5:
1
2text = "我在楼赛中中奖啦@";
usernames = []来源:蓝桥(实验楼)
链接:https://www.lanqiao.cn/challenges/50212/
解题思路
很简单的字符串模拟题。
题解1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40def after_at(text):
"""TODO
"""
usernames = []
def is_chinese(string):
"""
检查整个字符串是否包含中文
:param string: 需要检查的字符串
:return: bool
"""
for ch in string:
if u'\u4e00' <= ch <= u'\u9fff':
return True
return False
def is_char(char):
if is_chinese(char):
return True
elif char in ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"):
return True
else:
return False
for index, t in enumerate(text):
if t == '@':
# 避免越界
if index+1 < len(text):
if is_char(text[index + 1]):
start = index + 1
end = start
# 对 @ 后的字符做判断, 截取用户名
for x in text[start:]:
if is_char(x):
end = end + 1
continue
else:
if text[start: end] not in usernames:
usernames.append(text[start: end])
break
return usernames