具有特定字符数的字符串的正则表达式

2024-03-29 15:52:49 发布

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

使用刮擦选择器(https://doc.scrapy.org/en/latest/topics/selectors.html#regular-expressions),我尝试选择具有href属性的网页元素,该属性具有特定数量的正斜杠,例如/foo//foo/bar/(也总是以/开头和结尾)。你知道吗

到目前为止,为了匹配像/foo/bar/这样的相对url,我想出了

In [24]: re.match('^/[^/]+/[^/]+/$', '/foo/bar/')
Out[24]: <_sre.SRE_Match object; span=(0, 9), match='/foo/bar/'>

然而,对越来越多的斜杠(例如/foo/bar/bam/)重复这一点对我来说似乎是不必要的冗长。有没有更简洁的方法将字符串与给定的斜杠数(不是任何数)进行匹配?你知道吗


Tags: httpsorgdoc属性foohtmlmatchbar
3条回答

我在正则表达式方面比其他人慢很多。您确实指出要检查特定的斜杠数。这似乎可以做到。你知道吗

>>> import re
>>> link = '/foo/bar/foo/bar/foo/bar/foo/bar/'
>>> n=5
>>> re.match(r'(?:/[^/]+){%s}/'%(n-1), link)
<_sre.SRE_Match object; span=(0, 17), match='/foo/bar/foo/bar/'>
>>> n=6
>>> re.match(r'(?:/[^/]+){%s}/'%(n-1), link)
<_sre.SRE_Match object; span=(0, 21), match='/foo/bar/foo/bar/foo/'>

您可以使用此正则表达式匹配由/分隔的任意数量的子目录:

^(?:/[^/]+)*[^/]+/?$
  • ^-开始
  • (?:/[^/]+)*匹配0个或多个/,后跟一个或多个non-/字符串
  • [^/]+匹配路径的最后一个组件
  • /?$最后匹配选项/

要在html正文中获取URL,最好使用^{}

from scrapy.linkextractors import LinkExtractor
...
le =  LinkExtractor(allow='^/(?:[^/]+/){2}[^/]+/$') # for links with 2 slashes
all_links = le.extract_links(response) # all links matching the `allow` regex.
...

您还可以在LinkExtractor中保留including规则,以实际匹配更好的链接。你知道吗

相关问题 更多 >