在python中查找正则表达式第二个匹配项的索引

苏特拉

因此,我正在尝试重命名文件以匹配plex mediaserver的命名约定。(SxxEyy)

现在,我有大量使用例如的文件。S04E11为411。我编写了一个小函数,它将搜索这种模式的出现并将其替换为正确的约定。像这样 :

pattern1 = re.compile('[Ss]\\d+[Ee]\\d+')
pattern2 = re.compile('[\.\-]\d{3,4}')

def plexify_name(string):
    #If the file matches the pattern we want, don't change it
    if pattern1.search(string):
        return string
    elif pattern2.search(string):
        piece_to_change = pattern2.search(string)
        endpos = piece_to_change.end()
        startpos = piece_to_change.start()
        #Cut out the piece to change
        cut = string[startpos+1:endpos-1]
        if len(cut) == 4:
            cut = 'S'+cut[0:2] + 'E' + cut[2:4]
        if len(cut) == 3:
            cut = 'S0'+cut[0:1] + 'E' + cut[1:3]
        return string[0:startpos+1] + cut + string[endpos-1:]

而且效果很好。但事实证明,某些文件名中将包含一年。the.flash.2014.118.mp4在这种情况下,它将更改2014。

我尝试使用

pattern2.findall(string)

哪个确实会返回这样的字符串列表-> ['.2014','.118'],但是我想要的是matchobjects的列表,因此我可以检查是否有2个,在这种情况下,请使用第二。我似乎在re文档中找不到能做到这一点的东西。我缺少某些东西还是需要采取完全不同的方法?

罗伯托·邦瓦莱特

您可以尝试将匹配项锚定到文件扩展名:

pattern2 = re.compile(r'[.-]\d{3,4}(?=[.]mp4$)')

(?= ... )是一个前瞻性断言,这意味着必须有东西才能使正则表达式匹配,但这不是匹配的一部分:

>>> pattern2.findall('test.118.mp4')
['.118']
>>> pattern2.findall('test.2014.118.mp4')
['.118']
>>> pattern2.findall('test.123.mp4.118.mp4')
['.118']

当然,您希望它与所有可能的扩展一起使用:

>>> p2 = re.compile(r'[.-]\d{3,4}(?=[.][^.]+$)')
>>> p2.findall('test.2014.118.avi')
['.118']
>>> p2.findall('test.2014.118.mov')
['.118']

如果情节编号和扩展名之间还有更多内容,则用于匹配的正则表达式会变得棘手,因此我建议使用非正则表达式方法来处理:

>>> f = 'test.123.castle.2014.118.x264.mp4'
>>> [p for p in f.split('.') if p.isdigit()][-1]
'118'

或者,您也可以通过使用finditer迭代器并将其转换为列表来扩展,从而获得所有匹配项的匹配对象

>>> p2 = re.compile(r'[.-]\d{3,4}')
>>> f = 'test.2014.712.x264.mp4'
>>> matches = list(p2.finditer(f))
>>> matches[-1].group(0)
'.712'

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正则表达式更改字符串中的第二个匹配项

来自分类Dev

Python正则表达式仅查找成对引号的第二个引号

来自分类Dev

正则表达式仅查找第二个日期

来自分类Dev

Apache重写条件获得第二个正则表达式匹配

来自分类Dev

匹配第二个数值的正则表达式

来自分类Dev

正则表达式 - 仅匹配第二个发现

来自分类Dev

正则表达式:查找正则表达式中一个组的多个外观以及第二个组和边界

来自分类Dev

用于在python中的字符串中查找第二个数字组或开始搜索的正则表达式语法

来自分类Dev

正则表达式捕获捕获组中的第二个单词

来自分类Dev

如何使用 awk 在第二个文件中输出正则表达式

来自分类Dev

如果文本包含第二个字符串匹配项,则正则表达式排除匹配

来自分类Dev

Java匹配正则表达式然后使用第二个正则表达式格式化字符串

来自分类Dev

正则表达式删除与第二个字符串匹配的行?

来自分类Dev

正则表达式从逗号之间的倒数第二个单词中提取(完全匹配)单词?

来自分类Dev

正则表达式匹配文本,直到第二个点,不包括html标签

来自分类Dev

正则表达式以搜索文字匹配,然后是不包含第二个文字的文本

来自分类Dev

VBA正则表达式-第二个字符串匹配可选

来自分类Dev

Python正则表达式查找器的第二个组被第一个捕获的组忽略

来自分类Dev

Python正则表达式-查找并替换一对中的第二项

来自分类Dev

如何使用正则表达式在字符串的倒数第二个索引中插入特定字符

来自分类Dev

替换一个正则表达式,然后在所有与第一个不匹配的行中替换第二个正则表达式

来自分类Dev

为什么在Visual Studio中带有正向后视的正则表达式会导致每隔第二个匹配被替换?

来自分类Dev

如何防止第二个正则表达式重新替换?

来自分类Dev

正则表达式检索第二个捕获组

来自分类Dev

正则表达式-第二个位置没有“ p”

来自分类Dev

正则表达式以获取第二个单词

来自分类Dev

RewriteRule捕获正则表达式的第二个实例

来自分类Dev

使用正则表达式获取第二个括号内容

来自分类Dev

正则表达式以获取第二个单词

Related 相关文章

  1. 1

    正则表达式更改字符串中的第二个匹配项

  2. 2

    Python正则表达式仅查找成对引号的第二个引号

  3. 3

    正则表达式仅查找第二个日期

  4. 4

    Apache重写条件获得第二个正则表达式匹配

  5. 5

    匹配第二个数值的正则表达式

  6. 6

    正则表达式 - 仅匹配第二个发现

  7. 7

    正则表达式:查找正则表达式中一个组的多个外观以及第二个组和边界

  8. 8

    用于在python中的字符串中查找第二个数字组或开始搜索的正则表达式语法

  9. 9

    正则表达式捕获捕获组中的第二个单词

  10. 10

    如何使用 awk 在第二个文件中输出正则表达式

  11. 11

    如果文本包含第二个字符串匹配项,则正则表达式排除匹配

  12. 12

    Java匹配正则表达式然后使用第二个正则表达式格式化字符串

  13. 13

    正则表达式删除与第二个字符串匹配的行?

  14. 14

    正则表达式从逗号之间的倒数第二个单词中提取(完全匹配)单词?

  15. 15

    正则表达式匹配文本,直到第二个点,不包括html标签

  16. 16

    正则表达式以搜索文字匹配,然后是不包含第二个文字的文本

  17. 17

    VBA正则表达式-第二个字符串匹配可选

  18. 18

    Python正则表达式查找器的第二个组被第一个捕获的组忽略

  19. 19

    Python正则表达式-查找并替换一对中的第二项

  20. 20

    如何使用正则表达式在字符串的倒数第二个索引中插入特定字符

  21. 21

    替换一个正则表达式,然后在所有与第一个不匹配的行中替换第二个正则表达式

  22. 22

    为什么在Visual Studio中带有正向后视的正则表达式会导致每隔第二个匹配被替换?

  23. 23

    如何防止第二个正则表达式重新替换?

  24. 24

    正则表达式检索第二个捕获组

  25. 25

    正则表达式-第二个位置没有“ p”

  26. 26

    正则表达式以获取第二个单词

  27. 27

    RewriteRule捕获正则表达式的第二个实例

  28. 28

    使用正则表达式获取第二个括号内容

  29. 29

    正则表达式以获取第二个单词

热门标签

归档