学会了能让1小时的工作变成3分钟
一、设计一个正则来过滤一个字符串序列中的10到59
1.首先我们想到最简单的是patt=r"10|11|12|13...59",但是这样太复杂了,能不能简单一点呢~~有办法的,我们来分解一下:
作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要这是一个我的python交流群:831524055,不管你是小白还是大牛欢迎入驻 ,讨论技术, 大家一起交流学习成长!
首先这个数字是2位数
数字的都是十几,二十几,三十几,四十几,五十几,所以第一位数在1到5之间,第二位数在0到9之间
那么改成patt=r"[1-5][0-9]"
import re
patt=r'[1-5][0-9]'
match=re.findall(patt,'10,20,30,40,2,3,59,60')
if match:
print match
['10', '20', '30', '40', '59']
也许有同学不服气,说有啥了不起的,我用推导列表也可以搞定,是的这个你可以写成如下:
str1='10,20,30,40,2,3,59,60'
print [x for x in str1.split(',')
if int(x)>=10 and int(x)<=59]
['10', '20', '30', '40', '59']
1.1.好,我们来改动一下,若把字符串改成下面这样:
str1='xy,10,20,30,40,62,3,59,1w'
你这个时候再用列表推导就很难处理了,又有字符,又有数字,又有字符混合数字,怎么办
写代码要好多if/else,这是时候该正则表达式威猛帅哥出场啦,为啥题目说1个小时的事3分钟搞定有道理的,接着看
import re
str1='xy,10,20,30,40,62,3,59,1w'
patt=r'[1-5][0-9]'
match=re.findall(patt,'str1')
if match:
print match
['10', '20', '30', '40', '59']
看是不是很简便
2
过滤字符串中的只含2个字符的字母,并且第一个字母是大写A或B或C
有了上面的思路,可以顺藤摸瓜,好我们来分析一下
1).字母我们用[a-zA-Z]来表示,只含2个字母,那就[a-zA-Z][a-zA-Z]
2).第一个字母必须是大写的A或B或C,那就[ABC][a-zA-Z]
import re
patt=r'[A-C][a-zA-Z]'
match=re.findall(patt,'xy,1,2,3,4,Ab,w1,Cz')
if match:
print match
['Ab', 'Cz']
这招在过滤邮件里面经常用到,若不用正则表达式,启用其他的方法,则很麻烦,虽然也能解决,但是不方便
3
过滤一个字符串中的含3个字母的独立字符
比如这样的一个字符串'xy,1,2,?,123@sohu,Ab,w1,Cz,xyh,abc',我们怎么办,分析一下吧:
1).首先要设计出匹配字母并且是3个字母,我们很容易想到patt=r'[a-zA-Z][a-zA-Z][a-zA-Z]'或者patt=r'[a-zA-Z]{3}'
import re
patt=r'[a-zA-Z]{3}'
match=re.findall(patt,'xyhh,a,1,2,?,123@sohu,Ab,w1,Cz,xyh,abc')
if match:
print match
['xyh', 'soh', 'xyh', 'abc']
2).继续分析
上面的解决方案虽然解决了一部分的问题,但是很明显结果不完全正确,因为"xyhh","123@sohu"这样的字符组是我们不想要的
我们真正想要的是'xyh'和'abc',怎么办呢...我们可以这样改:patt=r'\b[a-zA-Z]{3}\b'
我们加上了"\b"表示匹配单词的边界,这样3个字母就是独立的字符组
import re
patt=r'\b[a-zA-Z]{3}\b'
match=re.findall(patt,'xyhh,a,1,2,?,123@sohu,Ab,w1,Cz,xyh,abc')
if match:
print match
['xyh', 'abc']
4
过滤一个字符串中的含3个字母的字符,并且最后一个字母是z
跟上面类似,大家思考一下应该很快有答案,有同学说是不是这样就可以了
import re
patt=r'[a-zA-Z][a-zA-Z][z]+'
match=re.findall(patt,'xy,1,2,3,4,Ab,w1,Cz,xyh,xyz,xyzz')
if match:
print match
['xyz', 'xyzz']
不对啊,怎么把'xyzz'弄进来来,大家思考一下为啥'+'不行,或者换成'*'行不行,欢迎留言讨论
正确的应该加'\b'来框定单词边界
import re
patt=r'\b[a-zA-Z][a-zA-Z][z]\b'
match=re.findall(patt,'xy,1,2,3,4,Ab,w1,Cz,xyh,xyz,xyzz')
if match:
print match
['xyz']
二. 匹配12小时制时间
首先先说下12小时制的时间.
12小时制的 12:50PM 对应 24小时制的12:50
12小时制的 12:50AM 对应 24小时制的 00:50
time.time() 方法是获取当前时间时间戳(以秒为单位的浮点数)
a1 = time.time()
print(a1)
1530705274.864062
time.localtime("时间戳") 方法是将时间戳转换为当地的时间, 不过不易读,想要更易读,使用time.asctime()方法转换一下
a2 = time.localtime(a1)
print(a2)
time.struct_time(tm_year=2018, tm_mon=7, tm_mday=4, tm_hour=19, tm_min=54, tm_sec=34, tm_wday=2, tm_yday=185, tm_isdst=0)
time.asctime() 方法将元祖格式的时间转换为更易读的方式
a3 = time.asctime(a2)
print(a3)
Wed Jul 4 19:59:43 2018
time.mktime() 将本地时间格式的元祖转换为时间戳
a7 = time.mktime(a2)
print(a7) # 输出时间戳
下面是经常会用到的转换
time.strftime()
time.strftime("你将要转换成的目标格式","你想要转换的原时间的本地时间形式或者是前面格式对应的元祖")
如果你要传元祖,元祖需要9个int类型的参数,9个参数分别对应本地时间格式的9个参数
strf_style = "%Y-%m-%d %H:%M:%S"
a4 = time.strftime(strf_style,time.localtime(time.time()))
print(a4)
2018-07-04 20:11:16
a5 = time.strftime(strf_style,(2017,5,21,13,14,0,0,0,0))
print(a5)
2017-05-21 13:14:00
time.strptime() 将你提供时间按照你提供的格式解析为本地时间(time.struct_time(9个参数的元祖))
与strftime正好相反,格式如下: 参数顺序与strftime不一样,要注意
time.strptime("你想要转换的时间数据","原数据对应的格式即第一个参数的格式")
a6 = time.strptime(a5,strf_style)
print(a6)
文章有参考https://www.jianshu.com/p/6ddf6f40f03chttps://www.jianshu.com/p/9af83e147527
仿微信聊天时间 根据用户12小时制还是24小时制区分显示上午和下午
微信聊天时间处理 处理12小时制 还是24小时制
@param timeStr 选择器传入的要处理的时间 格式:2018-12-12 12:12
@return 处理好的时间
-(NSString*)addTime:(NSString*)timeStr
{
NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]];
NSRangecontainsA = [formatStringForHoursrangeOfString:@"a"];
BOOLhasAMPM = containsA.location!=NSNotFound;
// NSLog(@"是否是12小时制--%d",hasAMPM);
//hasAMPM==TURE为12小时制,否则为24小时制
// 日期格式化类
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
// 设置日期格式(y:年,M:月,d:日,H:时,m:分,s:秒)
fmt.dateFormat = @"yyyy-MM-dd HH:mm";
// fmt.AMSymbol = @"上午";
// fmt.PMSymbol = @"下午";
// fmt.dateFormat = @"yyyy-MM-dd aaa";
// [yyyy-mm-dd] [hh:mm]
NSArray*dateArr = [timeStrcomponentsSeparatedByString:@" "];
//[yyyy,mm,dd]
NSArray *preDateArr = [[dateArr firstObject] componentsSeparatedByString:@"-"];
NSString*preDateStr;
NSString*dateStr;
if(preDateArr.count==3) {
preDateStr = [NSStringstringWithFormat:@"%@年%@月%@日",
preDateArr[0],preDateArr[1],preDateArr[2]];
dateStr = [NSStringstringWithFormat:@"%@月%@",
preDateArr[1],preDateArr[2]];
}
// 帖子的创建时间
NSDate*create = [fmtdateFromString:timeStr];
if(create.isThisYear) {// 今年
if(create.isToday) {// 今天
if(hasAMPM) { //
fmt.AMSymbol=@"上午";
fmt.PMSymbol=@"下午";
fmt.dateFormat=@"aaahh:mm";
}else{
fmt.dateFormat=@"HH:mm";
}
return[fmtstringFromDate:create];
}elseif(create.isYesterday) {// 昨天
if(hasAMPM) {
fmt.AMSymbol=@"上午";
fmt.PMSymbol=@"下午";
fmt.dateFormat=@"昨天 aaahh:mm";
}else{
fmt.dateFormat=@"昨天 HH:mm";
}
return[fmtstringFromDate:create];
}else{// 其他
if(hasAMPM) {
fmt.AMSymbol=@"上午";
fmt.PMSymbol=@"下午";
fmt.dateFormat= [NSStringstringWithFormat:@"%@ aaahh:mm ",dateStr];
}else{
fmt.dateFormat= [NSStringstringWithFormat:@"%@ HH:mm",dateStr];
}
return[fmtstringFromDate:create];
}
}else{// 非今年
if(hasAMPM) {
fmt.AMSymbol=@"上午";
fmt.PMSymbol=@"下午";
fmt.dateFormat= [NSStringstringWithFormat:@"%@ aaahh:mm ",preDateStr];
}else{
fmt.dateFormat= [NSStringstringWithFormat:@"%@ HH:mm",preDateStr];
}
return[fmtstringFromDate:create];
}
}
写有不足的地方或者侵犯,可以联系小编更改QQ:893687544。请各位大佬多多指教!!! 加我的python交流群:831524055分享以下资料给您