带有子模式异常的正则表达式模式(Python)

时间:2010-12-02 03:29:24

标签: python regex web-scraping

我正在使用BeautifulSoup从表中提取tabledata标签。 TD有一类“a”,“u”,“e”,“可用不可用”或“不可用”。 (是的,我知道古怪的班级名字,但是嘿......)

以下是一个例子:

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

我需要提取所有td的类名为'a'和'unavailable-available'。我一直在尝试一些负面的前瞻性断言,但没有太多运气。我会重视能够产生正确正则表达式的任何正则表达式传说......

3 个答案:

答案 0 :(得分:2)

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

这匹配字符串或空格的开头,后跟“a”或“不可用”,后跟空格或字符串结尾。所以它会匹配所有这些东西

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

答案 1 :(得分:0)

HA!

re.compile('^a(?!vail)|^un')
  • 匹配所有以'vail'开头并且所有开头'un'的开头。好联合国!

答案 2 :(得分:0)

我向其他人的RE力量低头。但作为BS + RE的另一个数据点,这里是一个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'](必须使用dict语法,因为class是Python关键字)。