ある教科書で、「教師は教師」みたいに同じ単語が助詞を挟んで繰り返される表現を、正規表現でみつけてこいという課題がありました。
それで、試しにですが、
test = '教師は教師、生徒も生徒、女の子は女の子、俺は天才'
という文字列を用意して、
re.findall(r'(.+).\1', test)
と書いてみると、
>>> test = '教師は教師、生徒も生徒、女の子は女の子、俺は天才'
>>> re.findall(r'(.+).\1', test)
['教師', '生徒', '女の子']
という実行結果になりました。
後方参照だと()の部分しか抜き出されないようで、これを「教師は教師」の形で出力するのはどうすればいいでしょうか?
re.finditer()を使って、以下のようにしたら一応それっぽいものができました。
>>> test = '教師は教師、生徒も生徒、女の子は女の子、俺は天才'
>>> results_itr = re.finditer(r'(.+).\1', test)
>>> for result in results_itr:
... print(result.group())
...
教師は教師
生徒も生徒
女の子は女の子
>>>
補足に書いてある group と同じことをやっているだけですが、正規表現全体を ()
でグルーピング。
re.findall(r'((.+).\2)', test)
語の繰り返しはふたつ目のグルーピングになるので、正規表現ちゅうの後方参照は \2
になります。
繰り返しをマッチさせるためのグルーピングは、正規表現の範囲ではどうしても残るので、それを取り除くにはリストをいじります。
map(lambda a:a[0], re.findall(r'((.+).\2)', test))
“Python - 数学 - データを統計量で記述する(統計電卓、平均値、最頻値、分散、標準偏差) | Kamimura's blog”
http://tweetdig.net/hashtag/Python
ありがとうございます!
2016/08/17 11:39:25()でくくってグループ化するとfindallでもまとまりで出力させることができるんですね。