Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 了解用于在html中查找字符串之间的字符串的正则表达式模式_Python_Regex_Python 2.7_Non Greedy - Fatal编程技术网

Python 了解用于在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

我有以下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/(.*)”
作为正则表达式匹配(例如)

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

导致如下情况:

videos/1610110089242029/“其他东西…”videos/2387423470237509/“

为了正确匹配as
1610110089242029
2387423470237509
而不是as
1610110089242029/“其他东西…”视频/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