使用 python re.compile 和漂亮的汤来匹配一个字符串

Posted

技术标签:

【中文标题】使用 python re.compile 和漂亮的汤来匹配一个字符串【英文标题】:Using python re.compile with beautiful soup to match a string 【发布时间】:2014-12-19 12:24:53 【问题描述】:

我想在返回的 http 标头中找到一个 url。根据beautiful soup,有一种方法可以使用soup.find_all(re.compile("yourRegex") 来收集数组中的正则表达式匹配。但是,我的正则表达式中一定遗漏了一些东西,它在text editor that I am using 的正则表达式中找到了匹配项,但与以下代码内部不匹配:

从 bs4 导入 BeautifulSoup 导入请求 重新进口 导入 csv 导入json 进口时间 导入文件输入 导入 urllib2

data = urllib2.urlopen("http://***.com/questions/16627227/http-error-403-in-python-3-web-scraping").read()
soup = BeautifulSoup(data)
stringSoup = str(soup)

#Trying to use compile 
print soup.find_all(re.compile("[a-zA-Z0-9\-\.]+\.(com|org|net|mil|edu|COM|ORG|NET|MIL|EDU)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?"))

我尝试将() 放在正则表达式周围,并以r 开头...我错过了什么是必要的?

我也一直在使用http://www.pythonregex.com/,将[a-zA-Z0-9\-\.]+\.(com|org|net|mil|edu|COM|ORG|NET|MIL|EDU)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])? 放在正则表达式部分,将网址放在另一部分,但那里也没有匹配项。 谢谢!

【问题讨论】:

stringsoup的内容是什么 jsfiddle.net/p8tu1e87/1 re.match 不会给出任何结果,因为它从一开始就匹配。你可以尝试 re.findall 代替 【参考方案1】:

你的正则表达式没有问题,但你没有得到这个概念。 find_all 只在标签中搜索。 示例: find_all("^b") 这会给你所有以名字 b 开头的标签 所以输出将是 p、tbody、body 等标签。 .如果你把re.compile放在find_all中,它只会在标签元素而不是整个html文档中寻找模式。 你需要使用vks解释的方法。

【讨论】:

【参考方案2】:
print re.findall(r"[a-zA-Z0-9\-\.]+\.(?:com|org|net|mil|edu|COM|ORG|NET|MIL|EDU)+(?:[\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?",x)

试试这个。这对我有用。

x="""<!DOCTYPE html>

<html itemscope itemtype="http://schema.org/QAPage">

<head>
"""

输出:schema.org/QAPage

【讨论】:

@maudulus: oh la la la,除了- 之外,您不需要转义字符类中的特殊字符,除非它位于类的末尾或开头。写[&amp;amp;]之类的东西不要有任何意义,字符类是没有顺序的字符集合,它与[;p&amp;ma]相同。

以上是关于使用 python re.compile 和漂亮的汤来匹配一个字符串的主要内容,如果未能解决你的问题,请参考以下文章

python中re模块的compile函数应该怎么用?

python的“re.compile”有啥作用?

python 正则(re.compile()/re.findall())

Python re模块 正则表达式之compile函数

Python 正则re模块之compile()和findall()详解

python中re.compile函数的使用