Python正则表达式:同一字符串中的多个条件匹配
我现在在使用一个函数来检查多个网址。这个函数会把一个网页的内容读成字符串,然后找出文件传输的进度百分比,像这样:
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 个回答
你只需要在正则表达式中使用 |
符号:
match = re.search(r"(In Progress \((.*)%\)|Transfer Aborted|Ready)", html)
这样,match.group(1)
就会包含所有的匹配结果(可能是 In Progress (00%)
、Transfer Aborted
或 Ready
),而 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 是基于假设表格是按日期排序的。如果不是,那你就需要在正则表达式中包含日期模式,并从匹配结果中找到最大日期的匹配项。