Pythonの正規表現に関する質問です。


ある教科書で、「教師は教師」みたいに同じ単語が助詞を挟んで繰り返される表現を、正規表現でみつけてこいという課題がありました。

それで、試しにですが、

test = '教師は教師、生徒も生徒、女の子は女の子、俺は天才'

という文字列を用意して、

re.findall(r'(.+).\1', test)

と書いてみると、

>>> test = '教師は教師、生徒も生徒、女の子は女の子、俺は天才'
>>> re.findall(r'(.+).\1', test)
['教師', '生徒', '女の子']

という実行結果になりました。
後方参照だと()の部分しか抜き出されないようで、これを「教師は教師」の形で出力するのはどうすればいいでしょうか?

回答の条件
  • 1人10回まで
  • 登録:2016/08/14 22:39:47
  • 終了:2016/08/17 11:41:52
id:midnightseminar

re.finditer()を使って、以下のようにしたら一応それっぽいものができました。

>>> test = '教師は教師、生徒も生徒、女の子は女の子、俺は天才'
>>> results_itr = re.finditer(r'(.+).\1', test)
>>> for result in results_itr:
... print(result.group())
...
教師は教師
生徒も生徒
女の子は女の子
>>>

回答(2件)

id:a-kuma3 No.1

a-kuma3回答回数4363ベストアンサー獲得回数18002016/08/15 10:33:13

ポイント100pt

補足に書いてある group と同じことをやっているだけですが、正規表現全体を () でグルーピング。

    re.findall(r'((.+).\2)', test)

語の繰り返しはふたつ目のグルーピングになるので、正規表現ちゅうの後方参照は \2 になります。


繰り返しをマッチさせるためのグルーピングは、正規表現の範囲ではどうしても残るので、それを取り除くにはリストをいじります。

    map(lambda a:a[0], re.findall(r'((.+).\2)', test))
id:midnightseminar

ありがとうございます!
()でくくってグループ化するとfindallでもまとまりで出力させることができるんですね。

2016/08/17 11:39:25
id:mateaifish No.2

mateaifish回答回数1ベストアンサー獲得回数02016/08/16 02:38:46

“Python - 数学 - データを統計量で記述する(統計電卓、平均値、最頻値、分散、標準偏差) | Kamimura's blog”

http://tweetdig.net/hashtag/Python

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません