正则表达困难

时间:2017-10-03 18:03:35

标签: python regex

所以这是我必须提取的链接:

http://www.hrmagazine.co.uk/article-details/finance-sector-dominates-working-families-benchmark

这就是我目前的

.+\/article-details\/.+\-.+\-.+\-.+\-.+\-.+$

然而,问题是它在" / article-details /"之后提取了任意数量的单词和连字符。部分,而不是具体的6个单词标题,用连字符代替上面的空格。所以它会接受一个糟糕的结果

http://www.hrmagazine.co.uk/article-details/finance-sector-dominates-working-families-benchmark-test

当我需要它时只接受像这种格式的链接

http://www.hrmagazine.co.uk/article-details/one-two-three-four-five-six

此类网站的正确正则表达式是什么?我在Scrapy / Spyder中提供的当前提取器如下

rules = (Rule(LinkExtractor(allow=['.+\/article-details\/.+\-.+\-.+\-.+\-.+\-.+$']), callback='parse_item', follow=True),)

2 个答案:

答案 0 :(得分:0)

正则表达式中的每个.+都可以匹配任意数量的任何字符 - 包括连字符。因此,您的整体正则表达式只需要至少5个连字符,而不是精确计数。使用[^-]+仅匹配非连字符。

请注意,正则表达式中没有任何反斜杠可以完成任何操作 - 在任何情况下,以下字符都不需要转义。即使它们是,你也需要加倍反斜杠,或者使用原始字符串r'whatever',以便re模块解释反斜杠,而不是Python&#39}。字符串文字解析规则。

答案 1 :(得分:0)

尝试用.之类的内容替换[a-z]; .也会匹配连字符,这就是为什么它匹配无限数量的单词:

.+\/article-details\/[a-z]+\-[a-z]+\-[a-z]+\-[a-z]+\-[a-z]+\-[a-z]+$

如果您需要匹配数字之类的内容,请将它们添加到括号中([a-z0-9]等)。