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进行排序

    1. # #!/usr/bin/env python
    2. # # coding=utf-8
    3. import re
    4. import logging
    5. class SortMoneyByMonth():
    6. logging.basicConfig(level=logging.INFO)
    7. def getParttenData(self, str, by, partten_str):
    8. '''取出数组中的月份和钱数以key-value形式放入字典中'''
    9. # re.search扫描整个字符串并返回第一个成功的匹配。
    10. if by == 'search':
    11. data = re.search(partten_str, str)
    12. # re.match从字符串的开始进行匹配,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;
    13. elif by == 'match':
    14. data = re.match(partten_str, str)
    15. # compile函数生成一个正则表达式( Pattern )对象,供match()和search()使用
    16. elif by == 'search_compile':
    17. parttern = re.compile(partten_str)
    18. data = parttern.search(str)
    19. elif by == 'match_compile':
    20. parttern = re.compile(partten_str)
    21. data = parttern.match(str)
    22. else:
    23. logging.info("匹配方式有误,请检查!")
    24. data = None
    25. if data is None:
    26. logging.info("没有匹配到数据,请检查!")
    27. return data
    28. def sortData(self, str_list, by, partten_str):
    29. ''' 将每个月的钱数取出放入列表中,注意有重复的月份时,钱数相加,再进行排序'''
    30. dic = {}
    31. for i in range(len(str_list)):
    32. data = self.getParttenData(str_list[i], by, partten_str)
    33. month = data.group(1)
    34. money = float(data.group(2))
    35. # 如果记录过该月份,则直接进行钱数相加
    36. if month in dic:
    37. money += dic[month]
    38. dic[month] = money
    39. # 取钱数进行排序
    40. print(sorted(dic.values()))
    41. if __name__ == '__main__':
    42. str_list = ['<data><month_class month="2019-05"/></data>......<data><money_class earnings="13564.5"></data> ',
    43. '<data><month_class month="2019-05"/></data>......<data><money_class earnings="13000"></data> ',
    44. '<data><month_class month="2019-06"/></data>......<data><money_class earnings="3456.5"></data> ',
    45. '<data><month_class month="2019-07"/></data>......<data><money_class earnings="1234567.98"></data> '
    46. ]
    47. search_partten = 'month="2019-(0?[0-9]|1[0,2])".*earnings="([0-9]+\.?[0-9]*)"'
    48. match_partten = '.*month="2019-(0?[0-9]|1[0,2])".*earnings="([0-9]+\.?[0-9]*)"'
    49. sort = SortMoneyByMonth()
    50. sort.sortData(str_list, 'search_compile', search_partten)
    51. sort.sortData(str_list, 'match_compile', match_partten)
    52. sort.sortData(str_list, 'search', search_partten)
    53. sort.sortData(str_list, 'match', match_partten)