【问题标题】:My regex "appears" to work in a tester, but not in my actual code我的正则表达式“似乎”在测试仪中工作,但不是在我的实际代码中
【发布时间】:2015-01-06 07:30:00
【问题描述】:

这是我的代码:

gasprices = requests.get("insert url here")

soup = BeautifulSoup(gasprices.content)
price1 = soup.find("div", class_="sp_p")

price1list = re.search('(p[0-9])', str(price1))

price1 解析为以下字符串:

< div class="sp_p">< div class="p2"></div>< div class="pd"></div>< div class="p8"></div>< div class="p1"></div></div>

现在,当我在Pythex 中运行它时,它匹配"p2""p8""p1",这就是我想要它做的事情。但是,当我在 python3 的正则表达式解释器中运行它时,它只匹配"p2"。我在这里搞砸了什么?

【问题讨论】:

    标签: python regex beautifulsoup python-3.4


    【解决方案1】:

    re.search 将搜索要发生的匹配的第一个实例,因此它不会为您提供所有匹配。

    改为使用re.findall(pattern, string) 来获取所有匹配项。

    >>> import re
    >>> string = """< div class="sp_p">< div class="p2"></div>< div class="pd"></div>< div class="p8"></div>< div class="p1"></div></div>"""
    >>> re.search('(p[0-9])', string)
    <_sre.SRE_Match object at 0x7fdefc9ee558>
    >>> re.findall('(p[0-9])', string)
    ['p2', 'p8', 'p1']
    

    【讨论】:

    • 这成功了!谢谢!我是正则表达式的新手,我不知道 findall 方法。非常感谢!
    【解决方案2】:

    此外,您可以让BeautifulSoup 完成这项工作,并找到所有与p\d+ 正则表达式匹配的类的divs(p 后跟一位或多位数字):

    import re
    from bs4 import BeautifulSoup
    
    data = """
    <div class="sp_p"><div class="p2"></div><div class="pd"></div><div class="p8"></div><div class="p1"></div></div>
    """
    
    soup = BeautifulSoup(data)
    print soup.find_all('div', class_=re.compile(r'p\d+'))
    

    打印:

    [<div class="p2"></div>, <div class="p8"></div>, <div class="p1"></div>]
    

    在你的情况下,用法是:

    price1.find_all('div', class_=re.compile(r'p\d+'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      相关资源
      最近更新 更多