OR statement and REGEX in Python



我使用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')]

我得到括号左侧的字符串是用<td>(.*?)</td>找到的,右侧的字符串是用</td>|padding:0;">(.*?)</div>找到的。我想知道应该在REGEX中添加什么才能得到下面这样的最终列表:

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

不要使用正则表达式解析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']

无论您如何解析/使用regex,您都可以在获得列表后使用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']

您可以按照自己想要的方式处理正则表达式的结果
类似这样的东西-

#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']

最新更新