为什么正则表达式不起作用?

时间:2014-04-16 22:41:25

标签: python regex python-2.7 youtube

我写了一个正则表达式来从Youtube视频中删除时间戳,我在Regex101中测试它似乎可以工作,但是当我在Python中使用它时,我会得到奇怪的输出。

正则表达式是

 t=(h?)\d*(m?)\d*(s?)\d*

我使用正则表达式的行是

time = re.search("(t=(h?)\d*(m?)\d*(s?)\d*)", s).groups()[0]

输入

http://www.youtube.com/watch?v=ZOGSMUIta_o&feature=share&t=7h18m42s

输出

t=7

预期输出

t=7h18m42s

Here is where I tested the expression.

我对编程仍然很陌生,所以非常感谢任何和所有的帮助!

2 个答案:

答案 0 :(得分:0)

您在regex101上测试的字符串是这个:

https://www.youtube.com/watch?v=TrSs453rRr8#t=h219m1551s515

您使用python测试的字符串是不同的:

http://www.youtube.com/watch?v=ZOGSMUIta_o&feature=share&t=7h18m42s

你的正则表达式t =(h?)\ d *(m?)\ d *(s?)\ d *返回t = 7因为它期望h之后的第一个字符为b" m&#34 ;而且" h"应该出现在" ="之后,但你有t = 7h18m42s所以你不能有" h"一个数字之后。您可以尝试将这些正则表达式更改为

t=\d*(h?)\d*(m?)\d*(s?)\d*

或者您正在使用网址。

t=[^&]

答案 1 :(得分:-1)

你想要使用这样的东西。

match = re.search(r"t=(?:\d+h)?(?:\d+m)?(?:\d+s)?", subject)
if match:
    result = match.group()
else:
    result = ""

请注意,括号中的表达式以?:开头。这不是必不可少的,但意味着我们不需要捕获内容。

另外,我不确定这些YouTube字符串是如何构建的,但如果“h”是可选的,那么它前面的数字也应该是可选的。这就是为什么每个时间组件都已在其自己的非捕获组中被隔离并成为可选组件的原因。