Python正则表达式:同一字符串中的多个条件匹配

0 投票
1 回答
1852 浏览
提问于 2025-04-18 15:31

我现在在使用一个函数来检查多个网址。这个函数会把一个网页的内容读成字符串,然后找出文件传输的进度百分比,像这样:

def check(server):
    logging.info('Fetching {0}.'.format(server))
    # Open page
    response = urllib2.urlopen("http://"+server+"/avicapture.html")
    tall = response.read() # puts the data into a string
    html = tall.rstrip()
    # Grab progress percentage.
    match = re.search('.*In Progress \((.*)%\).*', html)

然后在找到这个进度后,它会把百分比的数字以字符串的形式返回给父进程。

    if match:
        global temp
        global results
        temp = match.group(1)
        results = temp
        servers[server] = temp
        if int(temp) >= 98 and int(temp) <= 99:
            abort(server)
            alertmail(temp, server)
            rem = str(server)
            complete(rem)
            logging.info('{0} completed.'.format(server))
        return str(temp)

不过,有时候它不会显示“进行中”和百分比,而是会显示“传输中止”或者“准备就绪”。我该怎么设计这个函数,让它返回找到的状态,不管是进行中(带百分比)、传输中止,还是准备就绪?

补充说明:我忘了提,我需要根据结束时间来匹配最近的文件传输。(参考:http://www.whatdoiknow.net/dump/avicapture_full.html#status

部分解决方案:

    match = re.search('.*In Progress \((.*)%\).*', html)
    match2 = re.search('.*Ready.*', html)
    match3 = re.search('.*Transfer Aborted.*', html)
    if match:
        global temp
        temp = match.group(1)
        if int(temp) >= 98 and int(temp) <= 99:
            logging.info('{0} completed.'.format(server))
        return str(temp)
    elif match2:
        temp = "Ready"
        logging.info('{0} is ready.'.format(server))
        return str(temp)
    elif match3:
        temp = "Transfer Aborted"
        logging.info('{0} was Aborted.'.format(server))
        return str(temp)

不过,这个部分解决方案没有解决我需要识别最近传输的问题。

1 个回答

1

你只需要在正则表达式中使用 | 符号:

match = re.search(r"(In Progress \((.*)%\)|Transfer Aborted|Ready)", html)

这样,match.group(1) 就会包含所有的匹配结果(可能是 In Progress (00%)Transfer AbortedReady),而 match.group(2) 在第二和第三种情况下会得到数字 00(00是一个占位符)。

更新 1:关于需要获取最新的一行。这一 http://www.whatdoiknow.net/dump/avicapture.html 页面是相当简单的 HTML,所以我建议使用一些 HTML 解析工具(我推荐 beautifulsoup4,文档在这里:http://www.crummy.com/software/BeautifulSoup/bs4/doc/)来解析成树状结构,然后找到表格中第一个 N/A 的行,获取它前面的那一行,并对最后一列应用正则表达式。

更新 2:现在想想,可能不需要解析 HTML。你可以使用 re.findall(或者 re.finditer)来获取匹配的字符串元组列表(匹配对象),然后直接取最后一个项。

更新 3:更新 1 和更新 2 是基于假设表格是按日期排序的。如果不是,那你就需要在正则表达式中包含日期模式,并从匹配结果中找到最大日期的匹配项。

撰写回答