蓝桥楼赛第23期-Python-解析用户名字符串 题解

题目描述

在社交和即时通讯应用中,@ 字符通常用于提醒某人。例如,你在楼赛取得了好成绩,拿了奖品,激动地发送了一条微博并 @实验楼官方微博。本次挑战中,我们希望实现一个函数,能够自动提取出任意文本内容中 @ 字符后面的用户名,这对于日常使用 Python 分析社交媒体文本内容很有帮助。

补充 after_at(text) 函数中的 TODO 部分,使其实现我们需要的功能:

  • 返回一段指定文本 text 中任意 @ 字符后续的正确用户名。
  • 正确的用户名由连续中文字符、下划线和英文字母组成,不包含标点符号、空格和其他特殊字符。

要求

题目需使用 Python 3.6 完成,不能使用标准库 和 第三方库。

函数传入 text 为字符串类型,可能为空。

函数返回列表,且应按 text 字符串中的出现的正确用户名次数降序排列,次数相等无先后顺序,且不重复。

示例

  • 示例 1:

    text = "@实验楼 @shiyanlou 我在 @ 楼赛中中奖啦"; 
    usernames = ['实验楼', 'shiyanlou']
    
  • 示例 2:

    text = "@实验楼@shiyanlou 我在 @ 楼赛中中奖啦"; 
    usernames = ['实验楼', 'shiyanlou']
    
    
  • 示例 3:

    text = "@shiyanlou @实验楼 我在 @实验楼 楼赛中中奖啦"; usernames = ['实验楼', 'shiyanlou']
    
  • 示例 4:

    text = "@!实验楼 @shiyanlou 我在楼赛中中奖啦"; 
    usernames = ['shiyanlou']
    
    
  • 示例 5:

    text = "我在楼赛中中奖啦@"; 
    usernames = []
    

    来源:蓝桥(实验楼)
    链接:https://www.lanqiao.cn/challenges/50212/


  • 解题思路

    很简单的字符串模拟题。

  • 题解1:

    def 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
    
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Spaceack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值