Python模式匹配

2 投票
4 回答
823 浏览
提问于 2025-04-16 07:21

我现在正在把一个旧的bash脚本转换成Python脚本,并且想增加一些新功能。我已经完成了大部分工作,但在Python的模式匹配上遇到了很多麻烦。

在我之前的脚本中,我下载了一个网页,然后用sed命令提取我想要的元素。匹配的方式是这样的(这是我想要的其中一个值):

PM_NUMBER=`cat um.htm | LANG=sv_SE.iso88591 sed -n 's/.*ol.st.*pm.*count..\([0-9]*\).*/\1/p'`

它会匹配被<span class="count"></span>包裹的数字,前面是“olästa pm”这个短语。我正在处理的标记内容是:

<td style="padding-left: 11px;">
    <a href="/abuse_list.php">
        <img src="/gfx/abuse_unread.png" width="15" height="12" alt="" title="9  anmälningar" />
    </a>
</td>
<td align="center">
    <a class="page_login_text" href="/pm.php" title="Du har 3 olästa pm.">
        <span class="count">3</span>
</td>
<td style="padding-left: 11px;" align="center">
    <a class="page_login_text" href="/blogg_latest.php" title="Du har 1 ny bloggkommentar">
        <span class="count">1</span>
</td>
<td style="padding-left: 11px;" align="center">
    <a class="page_login_text" href="/user_guestbook.php" title="Min gästbok">
        <span class="count">1</span>
</td> 
<td style="padding-left: 11px;" align="center">
    <a class="page_login_text" href="/forum.php?view=3" title="Du har 1 ny forumkommentar">
        <span class="count">1</span>
</td> 
<td style="padding-left: 11px;" align="center">
    <a class="page_login_text" href="/user_images.php?user_id=162005&func=display_new_comments" title="Du har 1 ny albumkommentar">
        <span class="count">1</span>
</td> 
<td style="padding-left: 11px;" align="center">
    <a class="page_login_text" href="/forum_favorites.php" title="Du har 2 uppdaterade trådar i &quot;bevakade trådar&quot;">
        <span class="count">2</span>
</td>

我有点犹豫要不要发这个,因为感觉我在要求很多,但能不能请大家帮我想个办法在Python中解析这个?我已经抓狂了,正则表达式对我来说实在太难了(抱歉,开个玩笑)。我花了几个小时在实验和阅读Python的正则表达式手册,但就是搞不定。

为了让事情更清楚,我需要7个不同的表达式来匹配<span class="count"></span>中的数字。比如,我需要找到未读私信的数量(“olästa pm”)。

4 个回答

1

可以使用以下任意一个工具:

用正则表达式来解析HTML是个大忌,容易出问题。

4

你自己不会去解析HTML代码。你会使用Python里自带的HTML解析器来处理这些HTML。

2

你可以使用 lxml 这个工具,通过 xpath 来很简单地提取你想要的值。

举个例子

from lxml import html
page = html.fromstring(open("um.htm", "r").read())
matches = page.xpath("//a[contains(@title, 'pm.') or contains(@title, 'ol')]/span")
print [elem.text for elem in matches]

撰写回答