🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2389閲覧

python、正規表現、不特定の同じ単語の繰り返しを抽出したい。

hiranohirano

総合スコア33

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/02/04 03:44

編集2021/02/04 04:19

前提・実現したいこと

不特定の同じ単語の繰り返しを抽出したいです。

textの例
text1 = "honPythonPythonPythonPythonPyt"
text2 = "Python123Python12PythonPythonPython"
text3 = "Python1234565aaanohtyPPy"
text4 = "テキストてきすとDjangoDjangoDjangoDjangoあPythonあ"
text5 = "PythonPythonPythonとDjangoDjangoDjangoあいうえお"

text1は、Pythonという単語が4回繰り返されているので、Pythonという単語を抽出し4を返したいです。
text2は、Pythonという単語が5回使われていますが、連続で使われているのは最後の3回なので3を返したいです。
text3は、aaa、PPが連続しているので、aaaを抽出し3を返し、PPを抽出し2を返したいです。
text4は、途中でDjangoという単語が4回繰り返されているのでDjangoを抽出し、4を返したいです。
text5は、PythonとDjangoがそれぞれ3回繰り返されているので、Python、Djangoを抽出し3を返したいです。

text1~text5をそれぞれ解決できるコードではなく、まとめて1つの関数で解決できるようにしたいです。
解決策は、正規表現でなくとも、ライブラリ等でも何でも構いません。

どなたかお分かりになる方ご教示いただけますと幸いです。
宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/02/04 03:54 編集

質問に記載の例では「テキストの中には、繰り返しとなる単語のみが含まれており、その単語が単純に繰り返されているだけであり、その他の文字や、繰り返しの単語の一部が半端に含まれていない」ように見えるのですが、そのような理解でよろしいでしょうか。 より具体的にいえば、与えるtextが下記のようなパターン 1.「honPythonPythonPythonPythonPyt」(途中から繰り返しが現れる)や 2.「Python123Python12PythonPythonPython」(繰り返しの間に不定の文字が含まれている)や 3.「Python1234565aaanohtyPPy」 のような形は考慮しなくてよいのか、ということです。 また、仮に3の場合も考慮しなければならない場合「どのような結果を返すべきか」の仕様が不明確です。
ppaul

2021/02/04 04:01 編集

単語は指定せずに探したいという意味なのですね。
hiranohirano

2021/02/04 03:59

ご回答ありがとうございます。たしかにそうでした。1.2.のようなパターンを考慮した場合を想定しています。質問がわかりづらかったので修正致します。
hiranohirano

2021/02/04 04:20

ppaulさん、ご回答ありがとうございます。 はい、仰る通りです。質問がわかりづらくてすいません。編集させていただきました。
退会済みユーザー

退会済みユーザー

2021/02/04 04:26 編集

質問が修正されたので削除
hiranohirano

2021/02/04 04:35

qnoirさん、質問へのご指摘ありがとうございました。私のしたかったことは実現できました。この度はご回答いただきありがとうございました!
guest

回答2

0

ベストアンサー

Python

1text = "PythonPythonPythonPythonPython RubyRuby" 2 3for m in re.finditer(r"(\S+?)\1+",text): 4 print(f"'{m[1]}' の繰り返しが {len(m[0])//len(m[1])}回")

でしょうか。

「繰り返しが含まれるか?」でなく、「文字列全体がそういう繰り返しか?」であれば、forは必要なくfullmatch()で。

投稿2021/02/04 04:22

otn

総合スコア85891

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2021/02/04 04:27

コードを書いている間に書き直されている。 text1 = "honPythonPythonPythonPythonPyt" が、honPyt の繰り返しでなく、Python の繰り返しであるといのはどういう基準ですか?
hiranohirano

2021/02/04 04:36 編集

途中で書き直してしまいすいません、ご回答いただいたコードが私の実現したかったことです。 Pythonの繰り返しと書きましたが、よく考えたらhonPytの繰り返しを探す方が実現したかったことです。 この度はご回答いただきありがとうございました!
otn

2021/02/04 05:15

"AABCAABCAABC"のときは、AABCの繰り返しと判断して欲しいところですが、それは難しそう。 「1文字の繰り返しは無視する」であれば可能ですが、text3 のケースと両立しない。
guest

0

元文字列や検索文字列の条件があいまいでなんとも・・・
このケースであれば単純に元文字列の長さを検索文字列数で割るだけです

投稿2021/02/04 03:55

yambejp

総合スコア116694

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiranohirano

2021/02/04 04:34

私の質問がわかりづらかったので、質問を変更させていただきました。私の実現したかったことは解決致しました。この度はご回答いただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問