在Python正则表达式搜索中匹配字符串的通配符

2024-04-27 15:00:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我想我可以写一些快速的代码来下载Facebook页面的“粉丝”数量。

出于某种原因,尽管我已经尝试了相当多的迭代,但我无法获得以下代码来确定HTML中的fans数量。在本例中,我在web上找到的其他解决方案都与regex不匹配。当然,在两个匹配的位之间有一些通配符是可能的吗?

我要匹配的文本是“6个X fans”,其中X是一个页面拥有的任意数量的fans-我想得到这个数字。

我正在考虑间歇性地轮询这些数据并将其写入文件中,但我还没有着手解决这个问题。我还想知道这是否是正确的方向,因为代码看起来相当笨拙。:)

import urllib
import re

fbhandle = urllib.urlopen('http://www.facebook.com/Microsoft')
pattern = "6 of(.*)fans" #this wild card doesnt appear to work?
compiled = re.compile(pattern)

for lines in fbhandle.readlines():
        ms = compiled.match(lines)
        print ms #debugging
        if ms: break
#ms.group()
print ms
fbhandle.close()

Tags: 代码importre数量facebook页面urllib粉丝
3条回答

不需要正则表达式

import urllib
fbhandle = urllib.urlopen('http://www.facebook.com/Microsoft')
for line in fbhandle.readlines():
    line=line.rstrip().split("</span>")
    for item in line:
        if ">Fans<" in item:
            rind=item.rindex("<span>")
            print "-->",item[rind:].split()[2]

输出

$ ./python.py
--> 79,133

埃文·福斯马克已经给出了一个很好的答案。这只是更多的信息。

你有这句台词:

pattern = "6 of(.*)fans"

一般来说,这不是一个好的正则表达式。如果输入文本为:

“全银河99个粉丝中的6个”

然后匹配组(括号内的内容)将是:

“全银河99个粉丝”

所以,我们想要一个模式,它能抓住你想要的东西,即使是像上面这样愚蠢的输入文本。

在这种情况下,是否匹配空白并不重要,因为当将字符串转换为整数时,空白将被忽略。但是让我们写一个忽略空白的模式。

使用*通配符,可以匹配长度为零的字符串。在这种情况下,我认为您总是需要一个非空的匹配,所以您需要使用+来匹配一个或多个字符。

Python提供了非贪婪匹配,因此可以用它重写。带有正则表达式的旧程序可能没有非贪心匹配,因此我还将给出一个不需要非贪心的模式。

所以,非贪婪模式:

pattern = "6 of\s+(.+?)\s+fans"

另一个:

pattern = "6 of\s+(\S+)\s+fans"

\s表示“任何空白”,将匹配一个空格、一个制表符和一些其他字符(例如“表单源”)。\S表示“任何非空白区域”,并匹配任何{}将匹配的内容。

第一个模式比第一个输入文本的模式要好:

“全银河99个粉丝中的6个”

它将返回一个匹配组,该组只有99

但试试其他愚蠢的输入文本:

“99个狂热粉丝中的6个”

它将返回一个匹配的99 crazed组。

第二种模式根本不匹配,因为“疯狂”一词不是“粉丝”一词。

嗯。这里有最后一个模式,即使是愚蠢的输入文本,也应该总是做正确的事情:

pattern = "6 of\D*?(\d+)\D*?fans"

\d匹配任何数字('0''9')。\D匹配任何非数字。

这将成功匹配任何远程非二义性的内容:

“全银河99个粉丝中的6个”

匹配组将是99

“99个狂热粉丝中的6个”

匹配组将是99

“99 41个粉丝中的6个”

它不匹配,因为里面有第二个号码。

要了解有关Python正则表达式的更多信息,可以阅读variouswebpages。为了快速提醒您,在Python解释器中,请执行以下操作:

>>> import re
>>> help(re)

当你从网页上“刮”文本时,你有时可能会碰到HTML代码。一般来说,正则表达式不是忽略HTML或XML标记的好工具(请参见here);最好使用Beautiful Soup解析HTML并提取文本,然后使用正则表达式获取真正需要的文本。

我希望这是有趣和/或教育。

import urllib
import re

fbhandle = urllib.urlopen('http://www.facebook.com/Microsoft')
pattern = "6 of(.*)fans" #this wild card doesnt appear to work?
compiled = re.compile(pattern)

ms = compiled.search(fbhandle.read())
print ms.group(1).strip()
fbhandle.close()

您需要改用re.search()。使用re.match()尝试将模式与整个文档匹配,但实际上您只是试图匹配文档中的一个片段。上面的代码打印:79,110。当然,当它被其他人运行时,可能会是一个不同的数字。

相关问题 更多 >