【问题标题】:Why is the Regex not working?为什么正则表达式不起作用?
【发布时间】:2014-06-01 00:51:14
【问题描述】:

我编写了一个正则表达式来从 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.

我对编程还是很陌生,因此非常感谢任何和所有帮助!

【问题讨论】:

  • 您只是忘记了“=”和“h”之间的“\d*”。
  • 请注意,在同一个可选组中包含与“h”、“m”或“s”一起使用的数字会更有意义(请参阅我的回答)。

标签: python regex python-2.7 youtube


【解决方案1】:

您在 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" 和 "h " 应该出现在 "=" 之后,但是你有 t=7h18m42s 所以你不能在数字后面有一个 "h"。您可以尝试这些将您的正则表达式更改为

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

或者当您使用 url 时。

t=[^&]

【讨论】:

    【解决方案2】:

    你想使用这样的东西。

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

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

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

    【讨论】:

    • 我真的很想知道为什么有人不赞成这个答案。它比赞成的更正确。
    猜你喜欢
    • 2015-04-13
    • 1970-01-01
    • 2013-12-05
    • 2012-11-17
    • 2014-12-03
    相关资源
    最近更新 更多