92337


同じ単語が繰り返された場合にマッチする条件を作りたいです。

例)

[code]

    @りんご @みかん @バナナ @りんご @ぶどう
    
[/code]

という文字列があったとして、この文字列の中で@から始まり、半角スペースで終わるのをグループとして考えた時に、同じグループの文字列が2回以上あった場合にマッチする、という条件はどう書いたらいいでしょうか？

例の場合、「@りんご 」が2回出現しているので、「@りんご 」がマッチしている、と判定したいです。

よろしくお願いします。


CC BY-SA 4.0
2022-11-21T03:12:27.377
92334
2022-11-22T13:05:13.530
2022-11-22T12:15:24.853
3060
55519
question
正規表現
正規表現で同じ単語がn回以上出現した際にマッチする書き方

[code]

    >>> import re
    
    >>> text = '@りんご @みかん @バナナ @りんご @ぶどう'
    >>> re.findall(r'(@\w+)(?=.+\1\b)', text)
    ['@りんご']
    
    >>> text = '@りんご @みかん @バナナ @りんご @ぶどう @バナナ'
    >>> re.findall(r'(@\w+)(?=.+\1\b)', text)
    ['@りんご', '@バナナ']
    
    >>> text = '@りんご @みかん @バナナ @りんご @ぶどう @バナナチョコ'
    >>> re.findall(r'(@\w+)(?=.+\1\b)', text)
    ['@りんご']
    
[/code]


CC BY-SA 4.0
2022-11-21T04:11:22.640
92336
2022-11-21T04:46:16.293
2022-11-21T04:46:16.293
47127
47127
92334
answer


書き方は正規表現エンジンによって異なりますが、キャプチャしたグループの[後方参照](https://qiita.com/ikmiyabi/items/12d1127056cdf4f0eea5#%E3%82%AD%E3%83%A3%E3%83%97%E3%83%81%E3%83%A3)で実現できます。

例: `@りんご @みかん @バナナ @りんご @ぶどう`  
正規表現: `(@\S+ ).+\1`  
[正規表現チェッカー](https://www-creators.com/tool/regex-
checker?r=\(%40%5CS%2B%20\).%2B%5C1)

この回答は[類似回答](https://ja.stackoverflow.com/a/74460)の応用です。  
正規表現エンジンによっては`\w`が日本語にマッチしない場合があるので、今回の回答では`\S`(空白文字以外のすべての文字)を使用しました。

ところで今回の回答を検証するにあたって、ご質問の例では思った通りの結果が導けず苦戦しました。  
なぜなら最初の「@りんご 」はスペースが全角で、2回目の「＠りんご 」は＠が全角だからです。  
コンピュータや正規表現エンジンは全角文字と半角文字を全く別の文字として扱いますので、老婆心ながらコーディング時に全角と半角を混同しないようご忠言いたします。


CC BY-SA 4.0
2022-11-21T04:14:54.110
92337
2022-11-21T04:14:54.110
9820
92334
answer


payanecoさんの回答 `(@\S+ ).+\1` で概ね条件を満たしているのだと思いますが、気づいたことを。

mjyさんが指摘されていますが末尾に空白が要求されています。

[code]

    @ぶどう @ぶどう
    
[/code]

は末尾に空白がない場合にマッチしません。これに対処するにはグループの外に空白を移動する必要があります。

`(@\S+) .+\1`

しかし今度は

[code]

    @グレープ @グレープフルーツ
    
[/code]

にマッチしてしまいます。これに対処するには `\1` 側の後ろにチェックを入れます。

`(@\S+) .+\1( |$)`

ちなみに質問文は「同じ単語がn回以上出現した際にマッチする書き方」ですが、2回限定となっています。これに対処するには繰り返しが必要です。

`(@\S+)( .+\1){m}( |$)` （ここで `m` は `n-1` の整数）

ただし正規表現エンジンによっては `{}` に対応していない場合があります。なので、質問の際には利用する正規表現エンジンを明示していただきたいです。


CC BY-SA 4.0
2022-11-22T13:05:13.530
92380
2022-11-22T13:05:13.530
4236
92334
answer