正则表达式匹配错误

时间:2009-08-12 21:15:30

标签: python regex

我是Python的新手(我也没有任何编程培训),所以在我提出问题时请记住这一点。

我正在尝试搜索检索到的网页,并使用指定的模式查找所有链接。我已在其他脚本中成功完成此操作,但我收到错误消息

raise error, v # invalid expression
     

sre_constants.error:多次重复

我不得不承认我不知道为什么,但我又是Python和正则表达式的新手。但是,即使我不使用模式并使用特定链接(只是为了测试匹配),我也不相信我会返回任何匹配(当我打印match.group(0)时,没有任何内容发送到窗口。链接我测试过的是下面的注释。

有什么想法吗?通过例子我通常更容易学习,但是你能给予的任何建议都非常感谢!

布洛克

import urllib2
from BeautifulSoup import BeautifulSoup
import re

url = "http://forums.epicgames.com/archive/index.php?f-356-p-164.html"
page = urllib2.urlopen(url).read()
soup = BeautifulSoup(page)

pattern = r'<a href="http://forums.epicgames.com/archive/index.php?t-([0-9]+).html">(.?+)</a> <i>((.?+) replies)'
#pattern = r'href="http://forums.epicgames.com/archive/index.php?t-622233.html">Gears of War 2: Horde Gameplay</a> <i>(20 replies)'

for match in re.finditer(pattern, page, re.S):
    print match(0)

5 个答案:

答案 0 :(得分:1)

你需要逃避文字'?'和你想要匹配的文字'('和')'。

此外,我认为你正在寻找'+?'提供的非贪婪匹配,而不是'?+'。

More documentation here.

对于您的情况,请尝试:

pattern = r'<a href="http://forums.epicgames.com/archive/index.php\?t-([0-9]+).html"> (.+?)</a> <i>\((.+?) replies\)'

答案 1 :(得分:1)

这意味着你的正则表达式有错误。

(.?+)</a> <i>((.?+)

什么?+是什么意思?两个?和+是彼此相邻无关紧要的元字符。也许你忘了逃避'?'什么的。

答案 2 :(得分:1)

正如您所发现的那样,解析任意HTML并不容易正确。就像Beautiful Soup这样的包装。请注意,您在脚本中调用它,但之后不使用结果。有关如何使您的任务更轻松的示例,请参阅其文档here

答案 3 :(得分:0)

延伸其他人的写作:

。?表示“任何字符中的一个或零个”

。+表示“一个或多个任何角色”

正如你所希望的那样,将两者结合起来毫无意义;他们是不同的,矛盾的“重复”人物。因此,关于“多次重复”的错误是因为您在正则表达式中将这两个“重复”字符组合在一起。要修复它,只需确定您实际要使用哪一个,然后删除另一个。

答案 4 :(得分:0)

import urllib2
import re
from BeautifulSoup import BeautifulSoup

url = "http://forums.epicgames.com/archive/index.php?f-356-p-164.html"
page = urllib2.urlopen(url).read()
soup = BeautifulSoup(page)

# Get all the links
links = [str(match) for match in soup('a')]

s = r'<a href="http://forums.epicgames.com/archive/index.php\?t-\d+.html">(.+?)</a>' 
r = re.compile(s)
for link in links:
    m = r.match(link)
    if m:
        print m.groups(1)[0]