1

わかりにくいタイトルで申し訳ありませんが、これ以上のタイトルが思い浮かびませんでした。

一部のファイル名から部分文字列を解析するスクリプトを作成しようとしています。

たとえば、次のようなファイル名があります。

[Anime-Koi] GJ-bu - 07 [h264-720p][A8557259].mkv-00_07_33_00001.jpg

(これは明らかにアニメのスクリーンショットです。)

この名前から欲しいのはGJ-bu - 07部分文字列です。

私は正規表現についてほとんど知らないので、それを行うための正規表現を考え出そうと頭を悩ませてきました。

式の逆を見つけるのはとても簡単だと思ったので、次のように思いつきました。

'(\[[a-zA-Z0-9_-]*\]?[.a-zA-Z0-9_-]*)'

findall()上記の戻り値に対するPythonの:

['[Anime-Koi]', '[h264-720p]', '[A8557259].mkv-00_07_33_00001.jpg']

残念ながら、逆数を取得する方法がわかりませんでした。どんなに頭を悩ませても、必要なことを行う正規表現を思いつくことができませんでした。

では、ええと、返す式を考え出すのを手伝ってくれませんGJ-bu - 07か?

私はチートしてこれを行うことができることを知っています:

f = "[Anime-Koi] GJ-bu - 07 [h264-720p][A8557259].mkv-00_07_33_00001.jpg"
reg_ex = r'(\[[a-zA-Z0-9_-]*\]?[.a-zA-Z0-9_-]*)'
p = re.compile(reg_ex)
l = p.findall(f)
for st in l:
    f = f.replace(st, '')

でもそれは詐欺なのでやめたほうがいいです。

御時間ありがとうございます。

(注:これにはPython 2.7を使用していますが、3.2を使用しても問題はありませんが、ここで違いがあるとは思えません。)

4

3 に答える 3

3

これを試してください(sは入力です)。

re.search(r'(?:^|\s)([^[]*)(?=(?:\s|$))', s).group(1)

基本的には、スペースの後に任意の数の非[文字が続き、その後にスペースが続くことを意味します。

于 2013-03-05T01:33:13.160 に答える
1
import re

pat = '\[.+?\] *(.+?) *\[.+?\]'
reg = re.compile(pat)

ss = '[Anime-Koi] GJ-bu - 07 [h264-720p][A8557259].mkv-00_07_33_00001.jpg'

print reg.findall(ss)
于 2013-03-05T01:37:20.177 に答える
1

これを試して:

p = re.compile('\[.*\](\s.*\s)\[.*\].*\.jpg')
l = p.findall("[Anime-Koi] GJ-bu - 07 [h264-720p][A8557259].mkv-00_07_33_00001.jpg")
print l
于 2013-03-05T01:34:35.040 に答える