了解用于查找htm中字符串之间字符串的正则表达式模式

2024-10-02 02:26:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下html文件:

<!-- <div class="_5ay5"><table class="uiGrid _51mz" cellspacing="0" cellpadding="0"><tbody><tr class="_51mx"><td class="_51m-"><div class="_u3y"><div class="_5asl"><a class="_47hq _5asm" href="/Dev/videos/1610110089242029/" aria-label="Who said it?" ajaxify="/Dev/videos/1610110089242029/" rel="theater">

为了提取videos//"之间的数字字符串,我使用了我发现的以下方法:

^{pr2}$

我曾尝试在google上搜索一个解释(.*?)在这个特定实现中是如何工作的,但是我仍然不清楚。有人能给我解释一下吗?这就是所谓的“非贪婪”匹配吗?如果是,那是什么意思?在


Tags: 文件devdivhtmltabletrvideosclass
3条回答

.表示任何字符。*表示任何次数,包括零。?确实意味着非贪婪;这意味着它将尝试捕捉尽可能少的字符,也就是说,如果正则表达式遇到/,它可以将其与.匹配,但它不愿意这样做,因为.是非贪婪的,并且由于regex中的下一个字符很乐意匹配/.不需要。如果没有?,那么{}会吃掉整个文件的其余部分,因为它会在位上拼命地匹配尽可能多的内容,而且由于它匹配所有的内容,所以它将一直持续下去。在

可以用一种简单的方式来解释:

  • .:匹配任何内容(任何字符)
  • *:任意次数(至少零次)
  • ?:尽可能少的次数(因此非贪婪)。在
videos/(.*?)/"

作为正则表达式匹配(例如)

^{pr2}$

第一个捕获组返回1610110089242029,因为任何数字都是“any character”的一部分,并且其中至少有零个字符。在

?导致如下情况:

videos/1610110089242029/" something else … "videos/2387423470237509/"

正确匹配为1610110089242029和{},而不是1610110089242029/" something else … "videos/2387423470237509,因此“尽可能少地匹配”,因此“非贪婪”。在

本文中的?是重复运算符(+*,和{})上的一个特殊运算符。在可用的引擎中,这会导致重复出现懒惰非贪婪不情愿或其他类似术语。典型的重复是贪婪的,这意味着它应该尽可能匹配。因此,在大多数现代perl兼容引擎中有三种类型的重复:

.*  # Match any character zero or more times
.*? # Match any character zero or more times until the next match (reluctant)
.*+ # Match any character zero or more times and don't stop matching! (possessive)

更多信息可以在这里找到:http://www.regular-expressions.info/repeat.html#lazy表示不情愿/懒惰,这里:http://www.regular-expressions.info/possessive.html表示所有格(在这个答案中我将跳过讨论)。在

假设我们有字符串aaaa。我们可以用/(a+)a/匹配所有的a。实际上这是

match one or more a's followed by an a.

这将匹配aaaa。regex是贪婪的,它将匹配尽可能多的a。第一个子匹配是aaa。在

如果我们使用regex /(a+?)a这是

reluctantly match one or more as followed by an a
or
match one or more as until we reach another a

我们只需要匹配。所以在本例中,匹配是aa,第一个子匹配是a。我们只需要匹配一个a来满足重复,然后它后面跟着一个a。在

当使用regex在html标记、引号等通常为快速和脏操作保留的类似方法中进行匹配时,会出现很多问题。也就是说,使用regex从非常大和复杂的html字符串或带转义序列的引号字符串中提取可能会导致很多问题,但对于特定的用例来说,这是非常合适的。因此,在您的案例中,我们有:

^{pr2}$

表达式需要匹配videos/,后跟零个或多个字符,后跟/"。如果只有一个视频网址在那里,这是很好的,而不是不情愿。在

但是我们有

/videos/1610110089242029/" ... ajaxify="/Dev/videos/1610110089242029/"

毫无疑问,正则表达式将匹配:

^{4}$

它尽可能多地匹配,/和{}满足.就可以了。由于不情愿,匹配会在第一个/"处停止(实际上它是回溯的,但您可以单独阅读)。因此,您只得到您需要的部分url。在

相关问题 更多 >

    热门问题