質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

正規表現

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

Python

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

Q&A

解決済

3回答

3180閲覧

正規表現にfor文は使えない?

kay_ventris4

総合スコア269

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

正規表現

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

Python

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

0グッド

0クリップ

投稿2021/05/04 13:11

#問題
イメージ説明
ABC122 B問題より

#方針
本来であれば部分文字列は高々制約上56個までしか発生しないので、これを全探索すれば良いのですが、正規表現を用いた解法も無理ではなさそうと思い、やってみます。

#コード
入力例にある、'HATAGAYA'(この文字列に対する最長のACGT文字列は'ATAGA')を念頭に考えてみます:

Python

1import re 2 3name = 'HATAGAYA' 4li = [] 5for i in range(9): 6 li.append(re.search(r'[A.T.G.C]{i}', name)) 7 8print(li)

#出力

[None, None, None, None, None, None, None, None, None]

#考察・質問
おそらく{i}で指定したい部分文字列の長さを(ダブル)クオーテーションで囲ってしまっているが故、for i in range の i と {i} の i が対応していない為、Noneだらけのリストが返されているというところまでは考えられております。しかしながら、
li.append(re.search(r'[A.T.G.C]{0}', name)),
li.append(re.search(r'[A.T.G.C]{1}', name)),
li.append(re.search(r'[A.T.G.C]{2}', name)),...
とやっていくのは正直あまりにアホらしいので、何か方策を練りたいところなのですが、上のやり方でのfor文の使用が封印されてしまっている為、詰まっております。何か近いやり方での解決策は存在しますでしょうか。雑な質問とはなってしまいましたが、お力添え頂ける箇所がございましたら、ご教授のほどよろしくお願い申し上げます。

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

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

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

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

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

guest

回答3

0

正規表現には「最長一致の法則」というのがあるので、シンプルにマッチさせれば自動的に「最も長いACGT文字列」が得られるはずです。

いろいろ問題がありました。すいません。

import re name = 'HATAGAYA' acgt_string = re.search(r'[ACGT]+', a).string

投稿2021/05/04 14:20

編集2021/05/04 15:17
KojiDoi

総合スコア13692

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

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

LouiS0616

2021/05/04 15:36 編集

・ ご提示のコードは実行できません。(変数名が違うだけで、これはクリティカルな問題では無いです) ・ マッチオブジェクトのstring属性はマッチ対象の文字列全体を返しますから、そこからマッチ結果を知ることはできません。 ・ 最長一致と言うのは、「できるだけ長くマッチしようとする」法則であって、「一番長いマッチ文字列を探す」ものでは無いと認識しています。実際Pythonで HATAGAYA_AACCGGTT を対象に試してみましても、マッチするのは ATAGA であって AACCGGTT では無いです。https://wandbox.org/permlink/9RNOHsNYr2a7q5Xb
KojiDoi

2021/05/04 15:16

ああそうか、「短いACGT文字列」が本来得られるべき「最長の文字列」よりも前に存在しているかもしれない可能性を忘れていました。しかもstringが期待どおりの値を返さない。面目ない…最近こういうパターンが多いな。
guest

0

f文字列で埋め込めます
{}は2つ重ねればエスケープできます

i = 1 s = f'[A.T.G.C]{{{i}}}' assert s == r'[A.T.G.C]{1}'

投稿2021/05/04 13:51

taC-h

総合スコア289

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

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

0

ベストアンサー

次のようにして、文字列に変数を埋め込みます。

Python

1for: 2 li.append(re.search(fr'[A.T.G.C]{{{i}}}', name))

{{ は { のエスケープ表現です。}} も然り。
f文字列で {i} に i が埋め込まれた結果、[A.T.G.C]{2} みたいな文字列が作られます。

ただし

正規表現として [A.T.G.C] は明らかにおかしく、これは [ATGC] の誤りでしょう。

別解

for文を使わずとも、次のようにfindallで全抽出すれば充分に思います。

Python

1name = 'HATAGAYA' 2chunks = re.findall(r'[ATGC]+', name)

ATGC文字列のリストが得られるので、一番長いものを選べば良いです。
特にこの問題の場合長さが求められれば良いので、max(map(len, chunks)) で足ります。

投稿2021/05/04 13:35

編集2021/05/04 14:25
LouiS0616

総合スコア35668

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

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

kay_ventris4

2021/05/04 14:42

ご丁寧にありがとうございました。示して頂いた全方法で、実行することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問