在模式

时间:2016-03-13 14:15:58

标签: python regex

我正在尝试从HTML表格中的<th>标记之间提取文本。以下代码解释了问题

searchstr = '<th class="c1">data 1</th><th>data 2</th>'
p = re.compile('<th\s+.*?>(.*?)</th>|<th>(.*?)</th>')
for i in p.finditer(searchstr):print i.group(1)

代码产生的输出是

data 1
None

如果我将模式更改为<th>(.*?)</th>|<th\s+.*?>(.*?)</th>,则输出更改为

None
data 2

在两种情况下捕获组的正确方法是什么。我没有使用模式<th.*?>(.*?)</th>,因为搜索字符串中可能有<thead>个标记。

2 个答案:

答案 0 :(得分:5)

Why don't use an HTML Parser instead - BeautifulSoup,例如:

>>> from bs4 import BeautifulSoup
>>> str = '<th class="c1">data 1</th><th>data 2</th>'
>>> soup = BeautifulSoup(str, "html.parser")
>>> [th.get_text() for th in soup.find_all("th")]
[u'data 1', u'data 2']

另请注意,str对于变量名称来说是一个糟糕的选择 - 您正在隐藏built-in str

答案 1 :(得分:1)

您可以使用一个捕获组减少如下所示的正则表达式。

re.compile(r'(?s)<th\b[^>]*>(.*?)</th>')