【问题标题】:Regex Pattern Matching at Beginning of String with BeautifulSoup使用 BeautifulSoup 在字符串开头进行正则表达式模式匹配
【发布时间】:2019-07-20 14:54:32
【问题描述】:

我目前正在寻找一种通过正则表达式在 HTML 类名开头执行模式匹配的方法。我要匹配的模式是:

"col-xs-.*"

HTML 页面中的两个类示例是:

<div class="col-xs-12 col-sm-12 col-lg-12">
<div class="mod-tiles__sizer col-xs-6 col-sm-4 col-lg-3">

目标是只匹配上面的类名,因为它实际上以“col-xs-.*”开头,这就是我所追求的。使用我当前的正则表达式匹配,我似乎无法将这些类名单独列出。目前我正在尝试使用以下正则表达式模式进行匹配:

regex = re.compile('^col-xs-.*$')
soup.find_all("div", class_ = regex)

不幸的是,这种模式还会打印出第二个类名(其中“col-xs-.*”出现在中间,而不仅仅是在开头)。希望有人能解决这个问题。

【问题讨论】:

  • .* 匹配到字符串的末尾。试试\bcol-xs-\d+\b
  • @Thefourthbird 不幸的是,您的解决方案似乎不起作用。 .* 匹配到字符串结尾是否重要?我所需要的只是让模式出现在字符串的开头,我认为之后发生的其余部分并不是那么重要。

标签: regex python-3.x beautifulsoup


【解决方案1】:

我认为您希望attribute = value css 选择器以 ^ 运算符开头来指定要在类属性中查找的前缀字符串。

soup.select('[class^="col-xs-"]')

例子:

from bs4 import BeautifulSoup as bs

html = '''
<div class="col-xs-12 col-sm-12 col-lg-12">
<div class="mod-tiles__sizer col-xs-6 col-sm-4 col-lg-3">
'''
soup = bs(html, 'lxml')
classes = [' '.join(item['class']) for item in soup.select('[class^="col-xs-"]')]
print(classes)

【讨论】:

    【解决方案2】:

    我猜这个表达式可能会提取那些想要的类:

    import re
    
    regex = r"[\"']\s*(\bcol-xs-[0-9]+\b[^\"']+?)\s*[\"']"
    
    test_str = """
    
    <div class="col-xs-12 col-sm-12 col-lg-12"><div class="  col-xs-12 col-sm-12 col-lg-12  ">
    <div class="mod-tiles__sizer col-xs-6 col-sm-4 col-lg-3"><div class="col-xs-12 col-sm-12 col-lg-12">
    <div class="mod-tiles__sizer col-xs-6 col-sm-4 col-lg-3">
    
    """
    
    print(re.findall(regex, test_str, re.MULTILINE | re.IGNORECASE))
    

    输出

    ['col-xs-12 col-sm-12 col-lg-12', 'col-xs-12 col-sm-12 col-lg-12', 'col-xs-12 col-sm-12 col-lg-12']
    

    表达式在regex101.com 的右上方面板中进行了解释,如果您想探索/简化/修改它,在this link 中,您可以查看它如何与一些示例输入进行匹配,如果您愿意的话。

    【讨论】:

      【解决方案3】:

      如果您想在没有漂亮的 supe 的情况下找到它们,这就是这样做的方法。
      所有具有类属性的 div 标记,其中 col-xs- 位于值的开头:

      包括空白修剪。

      r"(?i)<div(?=(?:[^>\"']|\"[^\"]*\"|'[^']*')*?(?<=\s)class\s*=\s*(?:(['\"])\s*(col-xs-(?:(?!\1)[\S\s])*?)\s*\1))\s+(?:\"\S\s]*?\"|'\S\s]*?'|[^>]*?)+>"
      

      https://regex101.com/r/rsXqI9/1

      格式化:
      类值在第 2 组中。

       (?i)
       < div 
       (?=
            (?: [^>"'] | " [^"]* " | ' [^']* ' )*?
            (?<= \s )
            class \s* = \s* 
            (?:
                 ( ['"] )                      # (1)
                 \s* 
                 (                             # (2 start)
                      col-xs-
      
                      (?:
                           (?! \1 )
                           [\S\s] 
                      )*?
                 )                             # (2 end)
                 \s* 
                 \1 
            )
       )
       \s+ 
       (?: " \S\s ]*? " | ' \S\s ]*? ' | [^>]*? )+
       >
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-15
        • 1970-01-01
        • 1970-01-01
        • 2011-07-07
        • 1970-01-01
        • 2012-04-12
        • 2014-08-15
        相关资源
        最近更新 更多