与顺序无关的正则表达式 - 是否可能?

时间:2013-12-13 21:56:58

标签: regex

我正在尝试匹配以下视频网址:

<iframe width="420" height="315" src="//www.youtube.com/embed/F40ZBDAG8-o?rel=0" frameborder="0" allowfullscreen></iframe>

我有以下内容:

^<iframe
(\swidth="\d{1,3}")?
(\sheight="\d{1,3}")?
(\salt=""[^""<>]*"")?
(\stitle=""[^""<>]*"")?
\ssrc="//(www.youtube.com|player.vimeo.com)/[-a-z0-9+&@#/%?=~_|!:,.;\(\)]+"
(\sframeborder="[^""<>]*")?
(\sallowfullscreen)?
\s?/?></iframe>$

这是有效的,但我不能依赖于youtube将始终提供遵循此结构的嵌入链接这一事实。如果他们将width属性移至src之后,我的正则表达式将失败。

有没有办法进行与订单无关的分组,以解决这个问题?

1 个答案:

答案 0 :(得分:1)

您可以使每个搜索字词都是前瞻性的 - 这些字符串不会占用字符串,因此它们可以按任何顺序排列。例如:

<iframe (?=.*height="\d{1,3}")(?=.*width="\d{1,3}").*

将匹配

<iframe width="123" height="321"

<iframe height="321" width="123"

demo on regex101.com

我相信你可以自己完成(添加你想要匹配的所有术语)。

注意 - 这个“匹配” - 它不“提取”。但是它会告诉你所有这些术语都以任何顺序存在于表达式中。

编辑自从我开始撰写此答案后,出现了一些评论,这些评论会改变我对您的请求的理解。如果你“只是”想要提取src=的东西,你只需要

<iframe.*?src="([^"]+)"

和匹配(括号中的东西)将是第一个和第二个双引号之间的任何内容。通常,有比regex更好的工具来解析HTML - 我的个人偏好是BeautifulSoup(Python)。