

正規表現で、特定の単語が複数回出現する文字列を抽出することは可能でしょうか。

例えば 犬というKWが 下記例の②のように2回以上出現している文字列を抽出したいです。

例  
①犬はよく泣いています。  
②その家の犬は良く吠える犬です。  
③その犬はご飯を食べました。

※テキストエディタで対応できる方法を知りたいですが、もし可能であれば  
正規表現でとありますが、(python勉強中のため)pythonを使って自動化する例も併せて知りたいです。


CC BY-SA 4.0
2019-07-04T14:29:13.600
56395
2019-07-05T13:57:49.387
2019-07-04T14:41:07.900
19110
32946
question
python python3 正規表現
正規表現で、特定の単語が複数回出現する文字列を抽出することは可能でしょうか。


「"犬" が 2 回以上出現している」というのは "犬" が少なくとも 2 回出現していれば良いので、`.*犬.*犬.*` で検索できます。


CC BY-SA 4.0
2019-07-04T14:40:58.580
56396
2019-07-04T14:40:58.580
19110
56395
answer


私初心者ですが、ちょうど今日Pythonの正規表現の勉強をしたところなので、やってみました。

[code]

    slist = ['犬はよく泣いています。', 'その家の犬は良く吠える犬です。', 'その犬はご飯を食べました。']
    for words in slist:
        found = re.findall(".*犬.*犬.*", words)
        for match in found:
            print(match)
    
[/code]

インタプリタでやったのですが、以下のように真ん中の文だけ印字されました。

[code]

    >>> その家の犬は良く吠える犬です。
    
[/code]


CC BY-SA 4.0
2019-07-04T15:21:31.837
56399
2019-07-05T01:05:19.787
2019-07-05T01:05:19.787
34891
34891
56395
answer


python による自動化になりますが、探す文字列が "犬" のように決まっており固定であるならば、  
文字列の count メソッドを使用したフィルタリングが高速でよいと思います。  
count メソッドを使うと、文字列に含まれる、特定の文字列の数を数えることができます。  
(例えば `"abracadabra".count("abra")` は実行すると `2` となります。)  
以下にコードを載せておきます。

[code]

    def hantei(s, KW, th):
        return s.count(KW) >= th
    
    strings = ["犬はよく泣いています。",
               "その家の犬は良く吠える犬です。",
               "その犬はご飯を食べました。"]
    
    KW = "犬"
    th = 2
    
    filtered_strings = []
    for s in strings:
        if hantei(s, KW, th):
            filtered_strings.append(s)
    
    print(filtered_strings)
    # Out: ['その家の犬は良く吠える犬です。']
    
[/code]

参考までに、for 文のブロックを以下のように１行で書くこともできます。

[code]

    filtered_strings = [s for s in strings if hantei(s, KW, th)]
    
[/code]


CC BY-SA 4.0
2019-07-05T13:57:49.387
56423
2019-07-05T13:57:49.387
45
56395
answer