0

当我写这篇文章时,我意识到这个问题有两个部分,但是我认为我只真正停留在第一部分,因此第二部分仅提供上下文:

A部分:

我需要搜索 for 循环返回的每个值的内容(其中每个值都是一个 url),以查找以下内容:

href="/dir/Sub_Dir/dir/163472311232-text-text-text-text/page-n"

在哪里:

  • 数字163472311232可以是任何长度(即它可以是5478
  • -text-text-text-text可以是任意数量的不同单词
  • page-n从哪里page-2到任何数字
  • 其中匹配不会多次返回,即只返回唯一匹配,因此只会返回以下之一:

href="/dir/Sub_Dir/dir/5422-la-la/page-4

href="/dir/Sub_Dir/dir/5422-la-la/page-4

B部分:

所以逻辑是这样的:

list_of_urls = original_list
for url in list_of_urls:
    headers = {'User-Agent' : 'Mozilla 5.0'}
    request = urllib2.Request(url, None, headers)
    url_for_re = urllib2.urlopen(request).read()
    another_url = re.findall(r'href="(/dir/Sub_dir\/dir/[^"/]*)"', url_for_re, re.I)
    file.write(url)
    file.write('\n')
    file.write(another_url)
    file.write('\n')

我希望能给我类似的输出:

a.html
a/page-2.html
a/page-3.html
a/page-4.html
b.html
b/page-2.html
b/page-3.html
b/page-4.html

所以我的问题是(假设 B 部分的逻辑没问题):

用于 A 部分所需的正则表达式模式是什么?

我是 python 和正则表达式的新手,所以这将在一定程度上限制我对相对复杂的正则表达式建议等的理解。

更新:

在提出建议后,我尝试测试以下没有产生任何结果的正则表达式:

import re
content = 'href="/dir/Sub_Dir/dir/5648342378-text-texttttt-texty-text-text/page-2"'
matches = re.findall(r'href="/dir/Sub_Dir/dir/[0-9]+-[a-zA-Z]+-[a-zA-Z]+-[a-zA-Z]+-[a-zA-Z]+/page-([2-9]|[1-9][0-9]+)"', content, re.I)
prefix = 'http://www.test.com'
for match in matches:
    i = prefix + match + '\n'
    print i

解决方案:

我认为这是可行的正则表达式:

matches = re.findall(r'href="(/dir/Sub_Dir/dir/[^"/]*/page-[2-9])"', content, re.I)

4

1 回答 1

0

你可以拥有……大部分你想要的东西。正则表达式并没有真正做不同的事情,所以我建议您只使用它们来获取所有 URL,然后自己删除重复项。

在我的脑海中,它会是这样的: href="/dir/Sub_Dir/dir/[0-9]+-[a-zA-Z]+-[a-zA-Z]+-[a -zA-Z]+-[a-zA-Z]+/page-([2-9])|([1-9][0-9]+)"

加或减转义规则,允许使用哪些词的细节等。我是 Windows 人,有一个很棒的工具叫做 Expresso,它有助于学习正则表达式。我希望您使用的任何平台都有一个等价物,它会派上用场。

于 2013-05-01T04:41:10.500 回答