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-8
import re
import logging
class 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 = None
if data is None:
logging.info("没有匹配到数据,请检查!")
return data
def 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)