【问题标题】:OR statement and REGEX in PythonPython中的OR语句和正则表达式
【发布时间】:2014-12-06 18:30:19
【问题描述】:

我正在使用 REGEX 从 Python 中的 HTML 文档编译字符串列表。字符串要么在 td 标签内,要么在 div 标签内。我在正确使用 REGEX OR 以防止发生以下问题时遇到问题。如果我使用:

FindStrings= re.compile('<td>(.*?)</td>|padding:0;">(.*?)</div>')
MyStrings = re.findall(FindStrings, str(soup))
print MyStrings

我会得到类似的东西:

[('apple', ''), ('sky', ''), ('red', ''), ('', 'summer'), ('', 'pizza')]

我知道括号左侧的字符串是&lt;td&gt;(.*?)&lt;/td&gt;,而右侧的字符串是&lt;/td&gt;|padding:0;"&gt;(.*?)&lt;/div&gt;。我想知道应该在 REGEX 中添加什么以获得最终列表,如下所示:

['apple', 'sky', 'red', 'summer', 'pizza']

【问题讨论】:

    标签: python html regex html-parsing


    【解决方案1】:

    您可以按照您想要的方式处理正则表达式的结果。
    像这样的 -

    #Result of regex in MyStrings
    >>> MyStrings = [('apple', ''), ('sky', ''), ('red', ''), ('', 'summer'), ('', 'pizza')]
    >>> [s[0] if s[1]=='' else s[1] for s in MyStrings]
    ['apple', 'sky', 'red', 'summer', 'pizza']
    

    【讨论】:

    • 不,他想通过正则表达式直接提取正确的结果
    【解决方案2】:

    Do not use regex for parsing HTML。有专门的工具可以处理 HTML 格式。

    使用BeautifulSoup 包的示例:

    from bs4 import BeautifulSoup
    
    data = """
    <body>
        <table>
            <tr>
                <td>apple</td>
                <td>sky</td>
            </tr>
            <tr>
                <td>red</td>
            </tr>
        </table>
        <div>summer</div>
        <div>pizza</div>
    </body>
    """
    
    soup = BeautifulSoup(data)
    print [item.text for item in soup.find_all(['td', 'div'])]
    

    打印:

    [u'apple', u'sky', u'red', u'summer', u'pizza']
    

    【讨论】:

      【解决方案3】:

      无论您如何解析/使用正则表达式,您都可以在获得列表后使用 Python 的 itertools

      import itertools
      
      item_list = [("apple", ""), ("sky", ""), ("red", ""), ("", "summer"), ("", "pizza")]
      print(item_list)
      
      flat_list = list(itertools.chain(*item_list))
      result = filter(None, flat_list)
      print(result)
      

      输出:

      [('apple', ''), ('sky', ''), ('red', ''), ('', 'summer'), ('', 'pizza')]
      ['apple', 'sky', 'red', 'summer', 'pizza']
      

      【讨论】:

      • 噗。 这个被接受了吗?这可以通过一个简单的[ ''.join(x) for x in item_list ] 来完成,而不需要任何itertools 或其他任何东西。
      • 是的,它确实被接受了——而且 itertools 更快。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2012-07-17
      • 2019-12-11
      • 1970-01-01
      • 2014-09-19
      相关资源
      最近更新 更多