59730


## 実装したい内容

CSVで書き込んだ（`tweet.text`）から取得した`text`のツイートを`@mikipddw2on11`のみ取得したいです。

### ツイート（text）

[code]

    RT @mikipddw2on11: 今日の天気 #PR https://t.covIC68vSr4545
    
[/code]

`RT @mikipddw2on11:`の文字から始まりますが、別のツイートからRTがない場合  
`今日の天気`から文字はじめます。  
取得したいのは、`@mikipddw2on11`のみだけです。  
文字列は毎回異なりますが、RTがない場合、セルを空白にしたいです。

## 実装とエラー

他の方から[別の質問](https://ja.stackoverflow.com/q/59622/19110)にて正規表現でマッチさせる方法があると教えていただきましたが、

下記の２パターンの方法でやってみましたが、下記のようにエラーが表示されます。

コード①

[code]

    import tweepy
    import csv
    import re
    
    consumer_key = ""
    consumer_secret = ""
    access_key = ""
    access_secret = ""
    
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_key, access_secret)
    api = tweepy.API(auth)
    
    #ツイート取得
    tweet_data = []
    data = api.get_user
    
    for tweet in tweepy.Cursor(api.user_timeline,screen_name = "ID",exclude_replies = True).items():
        tweet_data.append([tweet.id,tweet.user.screen_name,tweet.created_at,tweet.text.replace('\n',''),tweet.favorite_count,tweet.retweet_count])
    
        pattern = re.compile(r"^RT (@(\w){1,15})")
        def get_username(tweet.text):
        for x in pattern.finditer(tweet.text):
            return x.group(1)
    
    #csv出力
    with open('tweets.csv', 'w',newline='',encoding='utf-8_sig') as f:
        writer = csv.writer(f, lineterminator='\n')
        writer.writerow(["user_id","username","created_at","text","fav","RT"])
        writer.writerows(tweet_data)
    
        df["text"] = [get_username(x) for x in df["retweet_count"]]
        df.to_csv("test_out.csv", index=False)
    
    pass
    
[/code]

エラー内容①

[code]

    File "im.py", line 23
        for x in regex.finditer(tweet.text):
          ^
    
[/code]

[別の方法②](https://ja.stackoverflow.com/questions/59622/%E6%96%87%E5%AD%97%E5%88%97%E3%81%8B%E3%82%89screen-
name%E3%81%A0%E3%81%91%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/59623?noredirect=1#comment64323_59623)でもやってみましたが、

コード

[code]

    ・・・省略
    
        pattern = re.compile(r"^RT (@(\w){1,15})")
        result1 = pattern.match(tweet.text)
    
    #csv出力
    with open('tweets.csv', 'w',newline='',encoding='utf-8_sig') as f:
        writer = csv.writer(f, lineterminator='\n')
        writer.writerow(["user_id","username","created_at","text","fav","RT"])
        writer.writerows(tweet_data)
    
[/code]

方法②はエラー表示されませんが、`tweet.text`の列`text`にはRTのアカウントはないです。

長文で失礼いたしました。  
もし分かる方いれば教えていただけますでしょうか？  
お手数ですがよろしくお願いします。


CC BY-SA 4.0
2019-10-15T13:06:06.697
59725
2019-10-15T23:54:03.883
2019-10-15T17:10:26.413
3060
18859
question
python python3
文字列からアカウントだけを取得する


  1. コードの文法自体が間違っている。
  2. 関数定義の場所がおかしい。
  3. dfが定義されていない。
  4. retweet_countはリツイートの数であり、"RT @"を含むテキストではない。

あなたのコードの文法ミスは、インデントの方法に起因するものです。pythonはインデントによってブロックを認識しているため、インデントが間違っているとエラーが出ます。

> File "im.py", line 23  
>  for x in regex.finditer(tweet.text):  
>  ^

これは明らかにあなたのインデント方法が間違っています。

また、関数定義(defから始まる構文)は、一般的にforループの中には書きません。

さらに、dfはpandasデータフレームで使われる変数名として一般的ですが、あなたのコードにはこれを初期化するコードが存在しません。

加えて、retweet_countという列に対する認識が間違っています。retweet_countはリツイートの回数であり、単なる整数値です。

上記を踏まえて修正したコードは以下です。

[code]

    import tweepy
    import csv
    import re
    import pandas as pd
    
    pattern = re.compile(r"^RT (@(\w){1,15})")
    
    
    def get_username(text):
        for x in pattern.finditer(text):
            return x.group(1)
    
    
    consumer_key = ""
    consumer_secret = ""
    access_key = ""
    access_secret = ""
    
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_key, access_secret)
    api = tweepy.API(auth)
    
    #ツイート取得
    tweet_data = []
    data = api.get_user
    
    debug = False
    
    for i, tweet in enumerate(
            tweepy.Cursor(api.user_timeline,
                          screen_name="wadainotweetrt",
                          exclude_replies=True).items()):
        tweet_data.append([
            tweet.id, tweet.user.screen_name, tweet.created_at,
            tweet.text.replace('\n', ''), tweet.favorite_count, tweet.retweet_count
        ])
        if i > 30 and debug:
            break
    
    #csv出力
    with open('tweets.csv', 'w', newline='', encoding='utf-8_sig') as f:
        writer = csv.writer(f, lineterminator='\n')
        writer.writerow(["user_id", "username", "created_at", "text", "fav", "RT"])
        writer.writerows(tweet_data)
    
    df = pd.read_csv("tweets.csv")
    df = df[["text"]]
    df["retweet_username"] = [get_username(x) for x in df["text"]]
    df.to_csv("./test_out.csv", index=False)
    
[/code]


CC BY-SA 4.0
2019-10-15T23:54:03.883
59730
2019-10-15T23:54:03.883
59725
answer