1

ツイートからリツイート キーワードとユーザー名を抽出する正規表現に取り組んでいます。これは、仕事をするためのかなりひどい正規表現の例です:

tweet='foobar RT@one, @two: @three barfoo'
m=re.search(r'(RT|retweet|from|via)\b\W*@(\w+)\b\W*@(\w+)\b\W*@(\w+)\b\W*',tweet)
m.groups()
('RT', 'one', 'two', 'three')

繰り返し\b\W*@(\w+)\b\W*パターンを圧縮して可変数にして、@three の後に @four を追加すると、それも抽出されるようにしたいです。これを繰り返すために多くの順列を試みましたが、+失敗しました。

私はまた、これが次のようなもののために働くことを望みます

tweet='foobar RT@one, RT @two: RT @three barfoo';

パターンが重ならない場合はre.finditer で実現できます。(パターンが重複するバージョンがあるため、最初の RT のみが取得されます。)

どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

3

試す

(RT|retweet|from|via)(?:\b\W*@(\w+))+'

\b\W*@(\w+)を '(?:...)` で囲むと、集計を取得せずに用語をグループ化して繰り返すことができます。

私はあなたの質問の2番目の部分に従っているかどうかわかりませんが、次のような構造を含むものを探しているかもしれません:

(?:(?!RT|@).)

これは、"@" または "RT" の先頭以外の任意の文字に一致しますが、これもキャプチャしません。

その場合は、次のようにします。

(RT|retweet|from|via)((?:\b\W*@\w+)+)

その後、後処理

re.split(r'@(\w+)' ,m.groups()[1])

個々のハンドルを取得するには?

于 2009-03-17T20:35:38.417 に答える