Saki0506
@Saki0506 (さき おぐら)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Python テキストの条件にマッチする結果を分岐させたい

Q&A

Closed

解決したいこと

テキストの条件にマッチする結果を分岐させたいです。
具体的にはTweepyを使用してタイムラインのツイートをfor文で件数と日時を指定してリストに格納するところまではできました。

「.text」メソッドでツイート自体は取得できるのですがそこからうまく分岐させることができません。
エラーも出ていなく、結果のみが思った通りにならなく困っております。

例えば下記のようなコードが書きたいです。
もし"Python"か"Java"という文字が含まれているかつ、”プログラミング”という文字が含まれていない場合は分岐させる。

if not "プログラミング" and "python" or "Jave"in tweet.text:
            tweet_result = tweet.id 
            tweet_list.append(tweet_result)
            print(tweet_list) 
            print(len(tweet_list))  

上記のように書いてみたのですがうまくいきませんでした。


~

list = []

~

if "Jave" in tweet.text:
            result = tweet.id 
            list.append(result)
            print(list) 
            print(len(list))  

あとは条件を一つだけに絞ってみてもなぜか結果が漏れることがありました。
Twitterのツイートをこの方法で条件分岐させるのはそもそも無理なのでしょうか?
エラー自体は出ていないので解決法が見つけれれなくて困っております。
わかる方いましたら教えていただけると嬉しいです。
よろしくお願いします。

0

3Answer

if "プログラミング" not in tweet.text and ("Python" in tweet.text or "Java" in tweet.text):

と書いてください。 X in text なら text がXを含むとき真、 X not in text なら含まないとき真になります。

A and B or C(A and B) or C の意味になり、 A or B and CA or (B and C) の意味になります。カッコの位置が違うのは演算子の結合優先度が違うからで、 and は or よりも強く結合します。つまり and と or を含んだ式では常に and の周りにカッコがあるのと同じ解釈になります。判断がつかなかったり or を先に評価したかったりする場合は明示的にカッコを書いてください。

一致しないことがあるのは大文字小文字が違うからかもしれません。たとえば "Java" in "java" は偽です。違いを無視したい場合は "Java".lower() in "java".lower() のように両辺を小文字化してください。

0Like

Comments

いつもご回答本当にありがとうございます。教えていただいた通りにやったら無事に動きました。
含まない条件も増やしたかったので以下のように書いてみました。

if ("RT" not in tweet.text or "料理" in tweet.text)  and ("カレー" in tweet.text or "シチュー" in tweet.text):

ですが、条件が今後増えていく可能性があるのでコードがどんどん長くなってしまう可能性が出てきました。
本来の質問からは少し外れているのですが、もしわかりましたらお時間がある時にお答えいただけると嬉しいです。
元々はTweepyの「.search」メソッドで実装していたのですが、検索用のアカウントを作成した方がシンプルそうなので途中で書き直したのですが、タイムラインのメソッドと「.search」メソッドでは勝手が違い四苦八苦しております...  リツイートを除外するにも私には上記のようなコードを実装するしか思いつきませんでした。

リンクは「.search」メソッドの参考文章です。
https://web-lh.fromation.co.jp/archives/10000051001

0Like

Tweet オブジェクトの retweeted プロパティが True ならリツイートだと判断できます。

search メソッドでもクエリに from:ユーザーID を含めれば指定のユーザーのツイートを検索できます。ただ検索 API はタイムライン API よりレートリミットが厳しいので頻繁に使うのには向かないですね。

条件式が長くなるのは仕方ないです。正規表現を使うとかメソッドに切り出すなど工夫すれば多少は短くなります。

0Like

Comments

  1. @Saki0506

    Questioner

    返信が遅くなってしまいましたが、usaiさんのおかげでやりたいことを実装できました!
    ありがとうございます。
    タイムラインから特定のツイートを実装して他のSNSに通知を送るプログラムが書けました。
    ですけど、このプログラムだとフォローしている人が多くなってタイムラインが膨大になると対処できなくなる欠点がありましたので、やはり.search_tweetsメソッドで作るのが一番いいと思い現在、試行錯誤中です!
    詳しく、説明いただいて本当にありがとうございます。

Your answer might help someone💌