4

パターン ( e\d\d) を複数回一致させ、それぞれをグループに取り込む方法はありますか? たとえば、文字列..

blah.s01e24e25

..4 つのグループを取得したい:

1 -> blah
2 -> 01
3 -> 24
4 -> 25

使用する明白な正規表現は (Python 正規表現では:

import re
re.match("(\w+).s(\d+)e(\d+)e(\d+)", "blah.s01e24e25").groups()

..しかし、次のいずれかに一致させたい:

blah.s01e24
blah.s01e24e25e26

できないように見える、という(e\d\d)+かできますが、最後の出現のみをキャプチャします。

>>> re.match("(\w+).s(\d+)(e\d\d){2}", "blah.s01e24e25e26").groups()
('blah', '01', 'e25')
>>> re.match("(\w+).s(\d+)(e\d\d){3}", "blah.s01e24e25e26").groups()
('blah', '01', 'e26')

TV エピソードのファイル名に一致する複数のパターンがあり、複数のエピソードを処理するために各式を複製したくないため、これを 1 つの正規表現で実行したいと考えています。

\w+\.s(\d+)\.e(\d+) # matches blah.s01e01
\w+\.s(\d+)\.e(\d+)\.e(\d+) # matches blah.s01e01e02
\w+\.s(\d+)\.e(\d+)\.e(\d+)\.e(\d+) # matches blah.s01e01e02e03

\w - \d+x\d+ # matches blah - 01x01
\w - \d+x\d+\d+ # matches blah - 01x01x02
\w - \d+x\d+\d+\d+ # matches blah - 01x01x02x03

..その他多数のパターンについても同様です。

問題を複雑にするもう1つのこと-これらの正規表現を構成ファイルに保存したいので、複数の正規表現と関数呼び出しを使用するソリューションは望ましくありません-しかし、これが不可能であることが判明した場合は、ユーザーが単純な正規表現を追加できるようにします

基本的に、正規表現を使用して繰り返しパターンをキャプチャする方法はありますか?

4

5 に答える 5

1

グループ化されていない括弧:(?:asdfasdg)

表示する必要はありません:(?: adsfasdf)?

c = re.compile(r"""(\w+).s(\d+)
                       (?:
                            e(\d+)
                            (?:
                                  e(\d+)
                            )?
                        )?
               """, re.X)

また

c = re.compile(r"""(\w+).s(\d+)(?:e(\d+)(?:e(\d+))?)?""", re.X)
于 2009-06-27T20:18:27.707 に答える
0

問題について考えた後、名前付きグループを使用するより簡単な解決策があると思います。

ユーザー(または私)が使用できる最も単純な正規表現は次のとおりです。

(\w+\).s(\d+)\.e(\d+)

ファイル名解析クラスは、最初のグループを番組名、2番目をシーズン番号、3番目をエピソード番号とします。これはファイルの大部分をカバーします。

これらにいくつかの異なる名前付きグループを許可します。

(?P<showname>\w+\).s(?P<seasonnumber>\d+)\.e(?P<episodenumber>\d+)

startingepisodenumber複数のエピソードをサポートするために、次のような2つの名前付きグループendingepisodenumberをサポートしshowname.s01e01-03ます。

(?P<showname>\w+\)\.s(?P<seasonnumber>\d+)\.e(?P<startingepisodenumber>\d+)-(?P<endingepisodenumber>e\d+)

そして最後に、episodenumber\d+(など)と一致する名前を持つ名前付きグループを許可します。episodenumber1episodenumber2

(?P<showname>\w+\)\.
s(?P<seasonnumber>\d+)\.
e(?P<episodenumber1>\d+)
e(?P<episodenumber2>\d+)
e(?P<episodenumber3>\d+)

それでも、異なる量のsのパターンを複製する必要がe01ありますが、2つの連続しないエピソード(のようなshow.s01e01e03e04)を含むファイルは存在しないため、starting/endingepisodenumberグループを使用するとこれを解決できます。奇妙なケースでは、ユーザーはepisodenumber\d+グループ名

これは実際にはパターンのシーケンスの質問に答えるものではありませんが、それは私がそれを尋ねる原因となった問題を解決します!(1つの正規表現で一致させる方法を示す別の回答を引き続き受け入れますs01e23e24...e27-誰かがこれを解決した場合!)

于 2009-06-27T20:32:22.000 に答える
0

おそらくそのようなものですか?

def episode_matcher(filename):
    m1= re.match(r"(?i)(.*?)\.s(\d+)((?:e\d+)+)", filename)
    if m1:
        m2= re.findall(r"\d+", m1.group(3))
        return m1.group(1), m1.group(2), m2
    # auto return None here

>>> episode_matcher("blah.s01e02")
('blah', '01', ['02'])
>>> episode_matcher("blah.S01e02E03")
('blah', '01', ['02', '03'])
于 2009-06-28T01:11:38.927 に答える