编写正则表达式以在Python中获取子字符串

时间:2013-03-05 01:27:00

标签: python regex regex-negation

我为非描述性标题道歉,但我想不出更好的标题。

我正在尝试编写一个解析某些文件名中的子字符串的脚本。

因此,例如,这里有一个这样的文件名:

[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_-]*)'

Python的findall()用于上述返回:

['[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毫无疑问,不过我怀疑它在这里有所不同。)

3 个答案:

答案 0 :(得分:3)

试试这个(s是输入)。

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

它实质上意味着,一个空格后跟任意数量的非[字符,然后是一个空格。

答案 1 :(得分: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

答案 2 :(得分: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)