python的正则表达式有match、search、compile三种使用方式:
- search扫描整个字符串并返回第一个成功的匹配
- match从字符串的开始进行匹配,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;
- compile函数生成一个正则表达式( Pattern )对象,供match()和search()使用
正则表达式中,括号()括起来的称为组,group(n),取表达式中第n个组的匹配结果,第一个组的值为group(1),依次类推,grooup(0)返回匹配整个表达式的字符串,groups()返回一个包含所有小组匹配结果的元组.
通过下面的示例进行进一步了解
有以下字符串,计算5、6、7月的钱数,并按从小到大排序 “
…… “ “ …… “ “
…… “ “
…… “
整体思路:
1.将字符串存为数组
2.取出数组中的月份和钱数以key-value形式放入字典中(借助正则进行取值)
3.取出字典中的values,使用sorted进行排序
# #!/usr/bin/env python# # coding=utf-8import reimport loggingclass SortMoneyByMonth():logging.basicConfig(level=logging.INFO)def getParttenData(self, str, by, partten_str):'''取出数组中的月份和钱数以key-value形式放入字典中'''# re.search扫描整个字符串并返回第一个成功的匹配。if by == 'search':data = re.search(partten_str, str)# re.match从字符串的开始进行匹配,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;elif by == 'match':data = re.match(partten_str, str)# compile函数生成一个正则表达式( Pattern )对象,供match()和search()使用elif by == 'search_compile':parttern = re.compile(partten_str)data = parttern.search(str)elif by == 'match_compile':parttern = re.compile(partten_str)data = parttern.match(str)else:logging.info("匹配方式有误,请检查!")data = Noneif data is None:logging.info("没有匹配到数据,请检查!")return datadef sortData(self, str_list, by, partten_str):''' 将每个月的钱数取出放入列表中,注意有重复的月份时,钱数相加,再进行排序'''dic = {}for i in range(len(str_list)):data = self.getParttenData(str_list[i], by, partten_str)month = data.group(1)money = float(data.group(2))# 如果记录过该月份,则直接进行钱数相加if month in dic:money += dic[month]dic[month] = money# 取钱数进行排序print(sorted(dic.values()))if __name__ == '__main__':str_list = ['<data><month_class month="2019-05"/></data>......<data><money_class earnings="13564.5"></data> ','<data><month_class month="2019-05"/></data>......<data><money_class earnings="13000"></data> ','<data><month_class month="2019-06"/></data>......<data><money_class earnings="3456.5"></data> ','<data><month_class month="2019-07"/></data>......<data><money_class earnings="1234567.98"></data> ']search_partten = 'month="2019-(0?[0-9]|1[0,2])".*earnings="([0-9]+\.?[0-9]*)"'match_partten = '.*month="2019-(0?[0-9]|1[0,2])".*earnings="([0-9]+\.?[0-9]*)"'sort = SortMoneyByMonth()sort.sortData(str_list, 'search_compile', search_partten)sort.sortData(str_list, 'match_compile', match_partten)sort.sortData(str_list, 'search', search_partten)sort.sortData(str_list, 'match', match_partten)
