首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python3regex如何正确地使用分组?

Python3regex如何正确地使用分组?
EN

Stack Overflow用户
提问于 2016-10-02 18:18:51
回答 1查看 116关注 0票数 0

编辑:对不起,我只允许插入两个链接,其他链接在这里是纯文本。

嗨,我是Python和regex的新手。我在regex101和许多其他网站上搜索了如何正确地使用它,但它只是不起作用,我不知道该怎么做。

我家里有一些IP摄像头,它们会发送ftp图片。它们的名称类似于(我从字符串中删除了MAC和串行):

  • image_20130225_175225_9.jpg
  • AABBCCDDEEFF(UserNameOfCam)__20150905215835_0.jpg
  • 112233445566(0000serial)__20130625223148_1337167.jpg
  • 012345-6789ABCDEF01-234567_20160724_180030.jpg
  • AA_BB_CC_DD_EE_FF_OPI-012345-QWERT__20130724133101_8.jpg

为了每天释放一次空间,所有这些jpeg图片将被转换成一个mp4,而不是一个带有批处理文件(windows)的菜单编码器。这已经起作用了,但是在图像中没有刻录时间信息。这只是一张没有OSD的普通照片。

因此,我尝试制作一个.srt文件,在视频播放器中将时间和日期显示为字幕。因为我在学校刚学到C,所以我硬编码了一个丑陋的方法来产生它,我看了每个文件名,并手动搜索了字符串中的哪个部分决定了每个凸轮。例如,第一个凸轮总是以"image_“开头,第二个以凸轮的名称开头,第三个是文件名中的序列等等。

看起来是这样:

代码语言:javascript
运行
复制
if(strstr(temp_line, "image"))  //for the first cam
        { do extracting info }
else if(strstr(temp_line, "(UserNameOfCam)_")) //for the second
        { do extracting info }
else if(...

这是非常不灵活的,如果我想重命名第二凸轮,我必须改变源代码的srt发生器手动C,并重新编译它每次。

然后我想,“见鬼,让我们试试Python,它是为那样的脚本而制作的”,经过几天、几个小时的编程和谷歌搜索,我制作了这个脚本。然后我想用regex做这件事,因为它非常合适。

由于我是初学者,我使用调试器来可视化regex的生成,并使用pythex进行匹配。到目前为止,它还能识别出第一台相机,我很高兴:)但经过几个小时的尝试,它能识别出更多的模式,我不知道自己做错了什么。我尝试了\g the (?P=和许多其他方法),但都没有起作用。我做了一件完全错误的事,不知道是什么。

这是第一个凸轮的图案

Www.decggex.com/r/kvd5IZc760Z-cZmz

这是第一个凸轮的匹配

这是前两个凸轮不起作用的尝试

Www.decggex.com/r/C0TwsxHS9QZoXIFc

如果需要,下面是生成srt的Python脚本。

pastebin.com/kZPQnu9T

有什么提示或建议如何使它起作用,或者我在哪里做错了步骤?

EDIT2: --我忘了提到,我需要从正则表达式中提取信息,因为时间和日期是文件名中的存储区。

EDIT3:,谢谢你的回复。我认为把所有东西放在一个正则表达式中会使它更快,因为它必须解析多达100 k行。此外,我还试图从正则表达式中提取信息,因为可以将模式命名为像“年份”这样的组。年信息总是一样的,所以我想,我们把年份模式做一次,并在需要时重用它,然后提取也是handled....though --它不是那样工作的。它可以从第一个摄像头中提取出所有有用的信息,但是如果我试图重复使用第一个凸轮的模式,那么第二个摄像头就不匹配了。"(?P=year)“线不匹配,如果我复制它与第一个凸轮同一行,它有一个错误,因为年份组现在是双倍。不过,如果我去掉第一个凸轮的整个图案就行了。

EN

回答 1

Stack Overflow用户

发布于 2016-10-02 18:31:21

你不需要做一个巨大的准则来匹配所有的东西。更好的做法是做几个更小的正则表达式来匹配特定的相机。

所以,如果你想要处理相机1和相机2一样,你的代码可能会像这样。

代码语言:javascript
运行
复制
import re

cam1 = re.compile(r'some regex')
cam2 = re.compile(r'something else')

if cam1.match(filename) and cam2.match(filename):
    process_data()

另外,只有当您想从regex中提取信息时,才需要分组。否则,分组并不是真正需要的(除非您希望使正则表达式更易读)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39820159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档