Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで文字列内の最長の連続する英字・数字の部分文字列を検索する方法

与えられた文字列には、数字と英字が混在している場合があります。この記事では、文字列の中から英字のみまたは数字のみが連続して並ぶ部分文字列のうち、最も長いものを見つける方法を2つのアプローチで解説します。

方法1: reモジュール(正規表現)を使う

Pythonのreモジュールを使用すると、数字のみまたは英字のみで構成される連続した部分文字列をすべて抽出できます。その後、max関数にkey=lenを指定することで、見つかった部分文字列の中から最も長いものだけを選び出します。部分文字列の検出と取得にはfindall関数を利用します。

なお、パターン\D+は「数字以外の任意の文字(空白や記号を含む)」にマッチするため、結果には空白や記号も含まれる点に注意してください。

サンプルコード

import re

def longSubstring(str):
    letter = max(re.findall(r'\D+', str), key=len)
    digit = max(re.findall(r'\d+', str), key=len)

    return letter, digit

str = 'Hello 459 Congratulations! 234'
print(longSubstring(str))

実行結果

上記のコードを実行すると、次の出力が得られます。

(' Congratulations! ', '459')

方法2: len()とwhileループを使う

こちらはシンプルながらやや処理の遅いアプローチです。whileループを用いて、文字列内に含まれる英字および数字の連続部分の長さを順番に調べます。各連続部分の長さを比較し、最終的に最も長い部分文字列だけを返します。

サンプルコード

def longSubstring(s):
    max_letterSeq = ''
    max_digitSeq = ''
    i = 0
    while (i < len(s)):

        current_letterSeq = ''
        current_digitSeq = ''

        # 英字が連続している間、収集する
        while (i < len(s) and s[i].isalpha()):
            current_letterSeq += s[i]
            i += 1

        # 数字が連続している間、収集する
        while (i < len(s) and s[i].isdigit()):
            current_digitSeq += s[i]
            i += 1

        # 数字でも英字でもない場合(記号など)はスキップ
        if (i < len(s) and not (s[i].isdigit())
                and not (s[i].isalpha())):
            i += 1

        # 最長の英字列を更新
        if (len(current_letterSeq) > len(max_letterSeq)):
            max_letterSeq = current_letterSeq

        # 最長の数字列を更新
        if (len(current_digitSeq) > len(max_digitSeq)):
            max_digitSeq = current_digitSeq

    return max_letterSeq, max_digitSeq

str = 'Hello 459 Congratulations! 234'
print(longSubstring(str))

実行結果

上記のコードを実行すると、次の出力が得られます。

('Congratulations', '459')

まとめ

reモジュールを使う方法はコードが簡潔で可読性が高い一方、\D+が空白や記号にもマッチするため、英字のみの部分文字列が必要な場合は注意が必要です。一方、whileループによる実装はコード量こそ増えますが、条件を細かく制御できるため、より厳密な仕様に対応できます。用途に応じて使い分けるとよいでしょう。

  1. Pythonで二分木の最長連続パスの長さを求めるアルゴリズムと実装

    二分木(バイナリツリー)が与えられたとき、木の中にある最長の連続パスの長さを求めることを考えます。ここでの「連続パス」とは、隣り合うノードの値が1ずつ増加、または1ずつ減少していくようなノードの並びのことです。問題の例例えば、次のような二分木が入力として与えられたとします。この場合、最も長い連続シーケンスは [2, 3, 4, 5, 6] となるため、出力は 5 になります。解き方のアプローチこの問題は、再帰的に各ノードを訪問しながら「増加パス」と「減少パス」の長さを追跡することで解けます。手順は以下の通りです。ルートがnullの場合は0を返す最大パス長を記録する変数 maxPath を0で初

  2. Pythonで最長の回文部分文字列を求める方法|動的計画法による解法を徹底解説

    文字列 S が与えられたとき、その中に含まれる最長の回文部分文字列を求める問題を考えてみましょう。ここでは文字列 S の長さは最大 1000 であると仮定します。たとえば、文字列が「BABAC」であれば、最長の回文部分文字列は「BAB」となります。 回文とは、前から読んでも後ろから読んでも同じになる文字列のことです。この問題は動的計画法(DP)を用いることで効率的に解くことができます。 動的計画法による解法の手順 この問題を解くために、以下の手順に従います。 文字列の長さと同じサイズの正方行列(2次元配列)を定義し、すべて False で初期化する 主対角成分を True に設定する。