在Python中使用OR语句和REGEX

时间:2014-10-11 20:16:24

标签: python html regex html-parsing

我使用REGEX从Python中的HTML文档编译字符串列表。字符串可以在td标记内找到,也可以在div标记内找到。我在使用REGEX时遇到问题或者是为了防止出现以下问题。如果我使用:

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

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