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


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

それで、試しにですが、

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

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

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

と書いてみると、

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

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

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2016/08/17 11:41:52
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
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

回答回数4973ベストアンサー獲得回数2154

ポイント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

回答回数1ベストアンサー獲得回数0

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

http://tweetdig.net/hashtag/Python

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

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

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

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

回答リクエストを送信したユーザーはいません