Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式匹配错误_Python_Regex - Fatal编程技术网

Python 正则表达式匹配错误

Python 正则表达式匹配错误,python,regex,Python,Regex,我是Python新手(我也没有任何编程培训),所以在我提问时请记住这一点 我正在尝试搜索检索到的网页,并使用指定的模式查找所有链接。我已经在其他脚本中成功地做到了这一点,但我得到了一个错误,即 sre_常量。错误:多次重复 我不得不承认我不知道为什么,但我对Python和正则表达式还是新手。但是,即使我不使用模式和特定链接(只是为了测试匹配),我也不相信我会返回任何匹配项(当我打印match.group(0)时,不会向窗口发送任何内容)。我测试的链接在下面被注释掉 有什么想法吗?对我来说,通过例

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

我正在尝试搜索检索到的网页,并使用指定的模式查找所有链接。我已经在其他脚本中成功地做到了这一点,但我得到了一个错误,即

sre_常量。错误:多次重复

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

有什么想法吗?对我来说,通过例子学习通常比较容易,但非常感谢您提供的任何建议

布罗克

导入urllib2
从BeautifulSoup导入BeautifulSoup
进口稀土
url=”http://forums.epicgames.com/archive/index.php?f-356-p-164.html“
page=urllib2.urlopen(url.read())
汤=美汤(第页)
模式=r'((.?+)回复)'
#模式=r'href=”http://forums.epicgames.com/archive/index.php?t-622233.html“>战争装备2:部落游戏(20条回复)”
对于re.finditer中的匹配(模式、页面、re.S):
打印匹配(0)

您需要对试图匹配的文本“?”和文本“(“and”)”进行转义

另外,我认为您正在寻找由“+?”提供的非贪婪匹配,而不是“?+”

对于您的情况,请尝试以下方法:

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

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

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

“+”是什么意思?两个?和+都是元字符,彼此相邻都没有意义。也许你忘了转义“?”或其他什么。

要扩展其他人写的内容:

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

.+表示“一个或多个任意字符”


正如你所希望看到的,将这两个词组合在一起毫无意义;它们是不同的、相互矛盾的“重复”字符。因此,你关于“多次重复”的错误是因为你将这两个“重复”组合在一起了正则表达式中的字符。若要修复它,只需确定实际要使用哪一个,然后删除另一个。

正如您所发现的,正确解析任意HTML并不容易。这就是Beauty Soup之类的软件包所做的。请注意,您在脚本中调用它,但不使用结果。请参阅其文档有关如何使任务更轻松的示例!

导入urllib2
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]
进口稀土 从BeautifulSoup导入BeautifulSoup url=”http://forums.epicgames.com/archive/index.php?f-356-p-164.html“ page=urllib2.urlopen(url.read()) 汤=美汤(第页) #获取所有链接 links=[str(match)表示汤中的match('a')] s=r“ r=重新编译 对于链接中的链接: m=r.match(链接) 如果m: 打印m.groups(1)[0]
它们在另一个顺序上是有意义的。+?是++的非贪婪匹配形式。除此之外。+?是一个或多个字符的非贪婪匹配。这就是他所追求的。我已经尝试了文档。由于我对Python甚至HTML都不熟悉,我很难“轻松”找到我需要它做的事情,尽管我毫不怀疑它可以做到o我需要什么。我更改了模式并再次运行脚本,但没有找到匹配项,至少当我尝试迭代我的匹配项并打印它们时,窗口中没有打印任何内容。有什么想法吗?手动查看文件的内容。当我查看它时,我在任何地方都看不到字符串“replies”。因此正则表达式不会找到任何匹配项atches.pattern=r'\?t-([0-9]+).html“>(.+?)(\([0-9]+?)回复\)?”可能更接近?我尝试了你的新模式,但我不知道它没有返回匹配项。我甚至缩短了模式并尝试了此代码,当我尝试打印match.group(0)时,什么都没有(我想)已发送到控制台。是否有想法?对于re.finditer(模式、页面、re.S)中的匹配,pattern=r'':打印匹配(0)有没有可能过滤我想要的链接…正如你在我尝试使用正则表达式时所看到的,我想要一组特定的链接。此外,我知道我很幸运,我希望得到链接文本。简言之,有没有可能过滤返回的链接并获得链接文本?有几件事:什么是“链接文本”"?中间的内容?或href值?或打开后的一些内容,在HTML源中甚至没有一个“回复”实例。你确定你在寻找它吗?为什么你接受一个与数据中的任何链接都不匹配的正则表达式作为答案?新到堆栈溢出,没有意识到这意味着我已经完成了,抱歉。通过链接text,我只是想要源代码中链接后的文本(之前的文本)。因为我对Python和web抓取不熟悉,所以我开始慢慢学习,并尽可能多地学习。但我所要做的就是从存档中获取链接(每页),跟随每个链接(讨论),并获取讨论的所有帖子。我需要将数据解析为“数据集”,它可以是一个列表,但简单地说,我想清理归档文件并收集每个文件的所有邮件标题和帖子。将解决方案标记为“唯一”通常意味着你对它感到满意,响应者不会期望得到任何进一步努力的奖励。此外,如果你选择了其中一个解决方案,但它实际上不起作用,响应者应该怎么做呢?新版本的代码会进入你引用的网页,删除所有链接,然后打印两个解决方案之间的所有文本开始和结束锚定标签。我想这就是你想要的。
(.?+)</a> <i>((.?+)
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]