【问题标题】:Write a regular expression to get a substring in Python编写正则表达式以在 Python 中获取子字符串
【发布时间】:2013-03-05 01:27:00
【问题描述】:

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

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

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

[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 没有疑虑,尽管我怀疑它在这里会有所不同。)

【问题讨论】:

    标签: python regex regex-negation


    【解决方案1】:

    试试这个(s 是输入)。

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

    本质上是一个空格,后面跟任意数量的非[字符,然后是一个空格。

    【讨论】:

    • +1 进行解释,虽然我不确定我们是否可以假设空格始终存在?
    • 添加了对字符串开头或结尾的检查
    • 这真是太好了。很干净到。但是是的,正如@Junuxx 所说,我不能总是一个空格。我找到了一个带有下划线的示例(尽管我认为大多数都有空格)。 (另外,感谢它帮助的解释!)。
    • 在这部分 (?:^|\s)\s 替换为 [\s_] 为空格或下划线。正则表达式有局限性。如果你想要完美,你需要非常清楚地定义你的输入。它不能随便弄明白,除非你给它一个模式。
    • @eyquem 的解决方案要求在您尝试匹配的文本之前和之后的括号中包含一些内容。它们也必须用空格分隔。尝试从字符串中删除[Anime-Koi],该代码将失败。
    【解决方案2】:

    试试这个:

    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
    

    【讨论】:

      【解决方案3】:
      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-15
        • 1970-01-01
        • 2020-05-13
        • 2017-06-07
        • 2011-06-26
        • 1970-01-01
        • 2021-12-30
        • 1970-01-01
        相关资源
        最近更新 更多