Python 了解用于在html中查找字符串之间的字符串的正则表达式模式
我有以下html文件:Python 了解用于在html中查找字符串之间的字符串的正则表达式模式,python,regex,python-2.7,non-greedy,Python,Regex,Python 2.7,Non Greedy,我有以下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" hre
<!-- <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/(.*)”
作为正则表达式匹配(例如)
videos/1610110089242029/”
第一个捕获组返回1610110089242029
,因为任何数字都是“任意字符”的一部分,并且其中至少有零个字符
?
导致如下情况:
videos/1610110089242029/“其他东西…”videos/2387423470237509/“
为了正确匹配as
1610110089242029
和2387423470237509
而不是as1610110089242029/“其他东西…”视频/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)
更多信息可以在这里找到:对于不情愿/懒惰和这里:对于所有格(在这个答案中我将跳过讨论)
假设我们有字符串aaaa
。我们可以将所有的a与/(a+)a/
匹配。实际上这是
匹配一个或多个a
,后跟a
这将匹配aaaa
。正则表达式是贪婪的,将匹配尽可能多的a
。第一个子匹配是aaa
如果我们使用regex/(a+?)a
,这是
不情愿地匹配一个或多个a
s,后跟a
或
匹配一个或多个
a
s,直到到达另一个a
也就是说,只匹配我们需要的。因此在这种情况下,匹配是aa
,第一个子匹配是a
。我们只需要匹配一个a
,以满足重复,然后它后面是一个a
当使用正则表达式在html标记、引号等类似的内容中进行匹配时,会出现很多问题——通常保留用于快速和肮脏的操作。也就是说,使用正则表达式从非常大和复杂的html字符串或带有转义序列的引号字符串中提取可能会导致很多问题,但对于特定的用例来说,这是非常好的我们有:
/Dev/videos/1610110089242029/
表达式需要匹配videos/
,后跟零个或多个字符,后跟/“
。如果只有一个视频URL,则无需勉强即可
然而,我们有
/videos/1610110089242029/" ... ajaxify="/Dev/videos/1610110089242029/"
如果不勉强,正则表达式将匹配:
1610110089242029/" ... ajaxify="/Dev/videos/1610110089242029
它尝试尽可能多地匹配
/
和“
满足
很好。由于不情愿,匹配会在第一次/“
时停止(实际上它会回溯,但你可以单独阅读)。因此,你只会得到你需要的url的一部分。匹配任何东西(
),任何次数(*
),尽可能少的次数(?
)(非贪婪)。此外,您还将您的问题标记为“非贪婪”。您可以查看它。已经有一些关于它的信息。非常棒的回答,谢谢!如果我的目标是从html中获取不止一个数字字符串(也就是说,在多个/Dev/videos/…/)之间有多个数字)我应该看看其他地方而不是regex方法吗?
1610110089242029/" ... ajaxify="/Dev/videos/1610110089242029