Python を使ってテキストからユーザー名を抽出する

PythonPythonBeginner
オンラインで実践に進む

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

このプロジェクトでは、Python を使ってテキストからユーザー名を抽出する方法を学びます。これは、SNS や即時メッセージングアプリケーションでよく行われるタスクであり、@文字が頻繁に使われて誰かを呼び出す際に役立ちます。

👀 プレビュー

## 例 1
>>> from parse_username import after_at
>>> text = "@LabEx @labex I won in the @ competition"
>>> print(after_at(text))
['LabEx', 'labex']
## 例 2
>>> text = "@LabEx@labex I won in the @ competition"
>>> print(after_at(text))
['LabEx', 'labex']
## 例 3
>>> text = "@labex @LabEx I won in the @LabEx competition"
>>> print(after_at(text))
['LabEx', 'labex']
## 例 4
>>> text = "@!LabEx @labex I won in the competition"
>>> print(after_at(text))
['labex']
## 例 5
>>> text = "I won in the competition@"
>>> print(after_at(text))
[]
## 例 6
>>> text = "LabEx@!"
>>> print(after_at(text))
[]
## 例 7
>>> text = "@!@LabEx @labex I won in the @LabEx competition @experiment"
>>> print(after_at(text))
['LabEx', 'experiment', 'labex']

🎯 タスク

このプロジェクトでは、以下を学びます。

  • 与えられたテキストからユーザー名を抽出するためのafter_at関数を実装する方法
  • エッジケースを処理し、関数のパフォーマンスを最適化する方法
  • さまざまな入力シナリオで関数をテストする方法

🏆 成果

このプロジェクトを完了すると、以下のことができるようになります。

  • Python を使ってテキストから関連情報を解析して抽出する方法を理解する
  • テキストからユーザー名を抽出する堅牢で効率的な関数を開発する
  • 関数の機能を向上させるために問題解決能力を活用する
  • コードを十分にテストして、期待通りに機能することを確認する

after_at関数を実装する

このステップでは、与えられたテキストからユーザー名を抽出するためのafter_at関数を実装します。

  1. コードエディタでparse_username.pyファイルを開きます。

  2. after_at関数の定義を見つけます。

  3. 関数は、空である可能性のある文字列textを入力として受け取る必要があります。

  4. 関数の中で、抽出されたユーザー名を格納するための空のリストusernamesを初期化します。

  5. find()メソッドを使ってtext内の最初の@文字のインデックスを見つけ、それをat_index変数に格納します。

  6. at_index-1でない間(@文字が見つかったことを意味する):

    • 空の文字列usernameを初期化します。
    • @文字の次のインデックスから始まるtext文字列内の文字を反復処理します。
    • 各文字に対して、isalnum()isalpha()メソッドを使って、それが英数字またはアンダースコアであるかどうかを確認します。
    • 文字が有効な場合、それをusername文字列に追加します。
    • 文字が無効な場合、ループを抜けます。
    • usernameが空でない場合、それをusernamesリストに追加します。
    • 前の@文字の次のインデックスから始まるtext文字列内の次の@文字のインデックスを見つけます。
  7. ループの後、set()関数を使ってusernamesリストから重複するユーザー名を削除します。

  8. カスタムキー関数を使ったsorted()関数を使って、各ユーザー名の出現回数に基づいてusernamesリストを降順にソートします。

  9. ソートされたusernamesリストを返します。

完成したafter_at関数は次のようになります。

def after_at(text):
    usernames = []
    at_index = text.find("@")  ## 最初の "@" の出現インデックスを見つける
    while at_index!= -1:  ## "@" 記号が見つからなくなるまでループを続ける
        username = ""
        for char in text[
            at_index + 1 :
        ]:  ## "@" 記号の後の文字を反復処理する
            if (
                char.isalnum() or char == "_" or char.isalpha()
            ):  ## 文字が英数字またはアンダースコアであるかどうかを確認する
                username += char  ## 文字をユーザー名に追加する
            else:
                break  ## 文字が英数字またはアンダースコアでない場合、ユーザー名に文字を追加しない
        if username:
            usernames.append(username)  ## 抽出されたユーザー名をリストに追加する
        at_index = text.find(
            "@", at_index + 1
        )  ## 次の "@" 記号を次のインデックスから探す

    ## 重複を削除し、出現回数の降順でソートする
    usernames = sorted(
        list(set(usernames)), key=lambda x: usernames.count(x), reverse=True
    )

    return usernames

after_at関数をテストする

このステップでは、提供された例を使ってafter_at関数をテストします。

  1. コードエディタでparse_username.pyファイルを開きます。
  2. ファイルの下部にあるif __name__ == "__main__":ブロックを見つけます。
  3. ブロックの中に、after_at関数をテストするために次のコードを追加します。
## 例 1
print(after_at("@LabEx @labex I won in the @ competition"))
## 例 2
print(after_at("@LabEx@labex I won in the @ competition"))
## 例 3
print(after_at("@labex @LabEx I won in the @LabEx competition"))
## 例 4
print(after_at("@!LabEx @labex I won in the competition"))
## 例 5
print(after_at("I won in the competition@"))
## 例 6
print(after_at("LabEx@!"))
## 例 7
print(after_at("@!@LabEx @labex I won in the @LabEx competition @experiment"))
  1. parse_username.pyファイルを保存します。
  2. 次のコマンドを使ってターミナルまたはコマンドプロンプトでparse_username.pyファイルを実行します。
python parse_username.py
  1. 出力がチャレンジで提供された期待される結果と一致することを確認します。
['LabEx', 'labex']
['LabEx', 'labex']
['LabEx', 'labex']
['labex']
[]
[]
['LabEx', 'experiment', 'labex']
✨ 解答を確認して練習

まとめ

おめでとうございます!このプロジェクトを完了しました。実力を向上させるために、LabEx でさらに多くの実験を行って練習してください。