使用python re查找包含x的url

时间:2013-04-06 08:12:24

标签: python regex python-2.7

使用python 2.7.3,urllib和re,我正在寻找包含:

的网址
href="/dirone/Dir_Two/dirthree/"

网址可能是,例如:

href="/dirone/Dir_Two/dirthree/5678-random-stuff-here-letters-and-numbers"

我想回来:

"/dirone/Dir_Two/dirthree/5678-random-stuff-here-letters-and-numbers"

使用此工具:

http://www.jslab.dk/tools.regex.php

我生成了正则表达式:

/^href\="\/dirone\/Dir_Two\/dirthree\/"$/im

这个正则表达式因此可以用python和re以下列方式使用:

object_name = re.findall('/^href\="\/dirone\/Dir_Two\/dirthree\/"$/im',url)
for single_url in object_name:
    do something

2 个答案:

答案 0 :(得分:2)

你真的想放弃^锚点;我怀疑href是否会出现在行的开头。

您不需要/im部分,应该用re.标志常量替换它们。你有Perl正则表达式语法,Python没有专门的/.../flags语法。

因此有太多的转义并且没有实际的Python字符串。并且您实际上并未包含5678-random-stuff-here-letters-and-numbers部分。

请改用:

object_name = re.findall(r'href="(/dirone/Dir_Two\/dirthree/[^"/]*)"', url, re.I)

我删除了多行标志,因为我们不再匹配已删除^的字符串的开头。我在路径周围添加了一个组((...)),以便findall()返回那些而不是整个匹配。 [^"/]*部分匹配任何字符而不是引号或斜杠来捕获文件名部分而不是另一个目录名。

简短演示:

>>> import re
>>> example = '<a href="/dirone/Dir_Two/dirthree/5678-random-stuff-here-letters-and-numbers">'
>>> re.findall(r'href="(/dirone/Dir_Two\/dirthree/[^"/]*)"', example, re.I)
['/dirone/Dir_Two/dirthree/5678-random-stuff-here-letters-and-numbers']

答案 1 :(得分:2)

与Martijn的答案类似,但假设您已获得HTML,则使用beautifulsoup

data = '<a href="/dirone/Dir_Two/dirthree/5678-random-stuff-here-letters-and-numbers">Content</a>'

from bs4 import BeautifulSoup
import re

soup = BeautifulSoup(data)
print [el['href'] for el in soup('a', href=re.compile('^/dirone/Dir_Two/.*'))]