带子模式例外的正则表达式模式(Python)

3 投票
3 回答
853 浏览
提问于 2025-04-16 07:55

我正在使用BeautifulSoup这个工具来从一个表格中提取数据标签。这个表格里的每个单元格(TD)都有不同的类名,可能是'a'、'u'、'e'、'available-unavailable'或者'unavailable-available'。(是的,我知道这些类名有点奇怪,但没办法…)

下面是一个例子:

<tr>
  <td class="u">4</td>
  <td class="unavailable-available">5</td>
  <td class="a'>6</td>
  <td class="available-unavailable">7</td>
  <td class="u">8</td>
  ...

我在处理一行代码时用到了re.compile()这个功能:

  tab = [int(tag.string) for tag in soup.find('table',{'summary':tableSummary}).findAll("td", attrs = {"class": re.compile('\Aa')})]

我需要提取所有类名为'a'和'unavailable-available'的单元格。我尝试了一些负向前瞻的技巧,但效果不太好。如果有高手能帮我写出正确的正则表达式,我会非常感激…

3 个回答

0

哈哈!

re.compile('^a(?!vail)|^un')
  • 这个规则会匹配所有以字母'a'开头的词,只要它们前面没有'vail'这个词,同时也会匹配所有以'un'开头的词。真不错!
0

我对其他人的正则表达式能力表示敬佩。不过,作为一种不同的参考,这里有一个用pyparsing实现的例子(假设那些麻烦的引号不匹配的问题已经解决):

html = """
<tr> 
  <td class="u">4</td> 
  <td class="unavailable-available">5</td> 
  <td class="a">6</td> 
  <td class="available-unavailable">7</td> 
  <td class="u">8</td> 
"""

from pyparsing import makeHTMLTags, withAttribute, oneOf, SkipTo

# define opening and closing tag expressions
td,tdEnd = makeHTMLTags("TD")

# only want opening TD's with certain classes
td.setParseAction(withAttribute(**{'class':oneOf("a unavailable-available")}))

# define overall pattern
patt = td + SkipTo(tdEnd)("contents") + tdEnd

# search for matches
for t in patt.searchString(html):
    print t.dump()

输出结果:

['TD', ['class', 'unavailable-available'], False, '5', '</TD>']
- class: unavailable-available
- contents: 5
- empty: False
- endTd: </TD>
- startTd: ['TD', ['class', 'unavailable-available'], False]
  - class: unavailable-available
  - empty: False
['TD', ['class', 'a'], False, '6', '</TD>']
- class: a
- contents: 6
- empty: False
- endTd: </TD>
- startTd: ['TD', ['class', 'a'], False]
  - class: a
  - empty: False

对于每一个匹配的结果,你还可以直接访问 t.contentst['class'](因为 class 是Python的关键字,所以需要用字典的语法来访问)。

2
table.findAll('td', attrs = {"class":re.compile(r'(^|\s)(a|unavailable-available)($|\s)')})

这个规则是用来匹配字符串的开头,或者是空格后面跟着“a”或者“unavailable-available”,然后后面再跟空格或者字符串的结尾。所以它可以匹配这些不同的情况。

class="a"
class="a ui-xxx"
class="ui-xxx a"
class="ui-xxx a ui-yyy"
class="unavailable-available"
class="unavailable-available foo"

撰写回答