这个正则是将<python核心编程>第15章正则表达式课后习题19-27糅合到一起了.
这里使用了python语言编写程序, 但是, 希望喜欢正则表达式的朋友不要因为不懂python的语法而转身就走.
正则虽然和语言有一点关系, 但是, 不影响我们跨语言学习正则的. 喜欢正则又不懂python语法的朋友, 可以只看patter = re.compile()所传入的那个模式的嘛
就这个正则表达式本身来说, 其实已经涉及了正则基础方面的很多东西, 最基础的匹配除外, 牵扯到了子组匹配, 子组命名, 条件匹配等多种内容, 个人感觉对学习正则会有帮助.
以下内容纯属原创, 转载请声明出处: http://blog.csdn.net/lgg201
#!/usr/bin/env python # -*- coding: utf-8 -*- ''' Created on 2009-10-23 @author: selfimpr @blog: http://blog.csdn.net/lgg201 @mail: [email protected] @copyright: keep all copyright ''' ########################## # 转载请声明出处. # http://blog.csdn.net/lgg201 ########################## import re, time datas = ['Thu Jul 22 19:21:19 2004::[email protected]::1090549279-4-11', 'Sun Jul 13 22:42:11 2008::[email protected]::1216014131-4-11', 'Sat May 5 16:36:23 1990::[email protected]::641950583-6-10', 'Thu Feb 15 17:46:04 2007::[email protected]::1171590364-6-8', 'Thu Jun 26 19:08:59 2036::[email protected]::2098145339-7-7', 'Tue Apr 10 01:04:45 2012::[email protected]::1334045085-5-10'] pattern = re.compile(r'''(?x) ^(?P<week>Mon|Tue|Wed|Thu|Fri|Sat|Sun)/ #匹配星期 (?P<month>Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Seq|Oct|Nov|Dec)/ #匹配月份 (?P<day> #匹配天数, 限定字符串范围: 1-9, 01-29, 30-31 ( (?P<day_tens_digit_one_two>[12]) |(?P<day_tens_digit_three>3) |0? ) (?(day_tens_digit_one_two)[0-9]|(?(day_tens_digit_three)[01]|[1-9])) )/ (?P<hour> #匹配小时, 限定字符串范围: 1-9, 01-19, 20-24 ((?P<hour_tens_digit_one>1)|(?P<hour_tens_digit_two>2)|0?) (?(hour_tens_digit_one)[0-9]|(?(hour_tens_digit_two)[0-4]|[1-9])) ): (?P<minute> #匹配分钟, 限定字符串范围: 0-9, 00-59 ([1-5]|0?)[0-9] ): (?P<second> #匹配秒钟, 限定字符串范围: 0-9, 00-59 ([1-5]|0?)[0-9] )/ (?P<year> #匹配年份, 年份比较简单, 不再做复杂匹配 /d{4} ):: (?P<mail> #匹配邮箱, 整个邮箱取出为新组mail, 然后分别把邮箱登录名和邮箱的服务提供商域名解析为mail_name和mail_domain (?P<mail_name>[a-zA-Z_]/w+)@(?P<mail_domain>(/w+/.)+(edu|com|gov|net|cn)) ):: (?P<timestamp> #匹配时间戳 /d{9,10} )/- (?P<other1> #匹配倒数第二个数字 /d )/- (?P<other2> #匹配倒数第一个数字 ([1-9]|0?)/d ) ''') def getdata(strdata, need_group_names = ('week', 'month', 'day', 'hour', 'minute', 'second', 'year', 'mail', 'mail_name', 'mail_domain', 'timestamp', 'other1', 'other2')): if not isinstance(strdata, str): raise TypeError, 'please give me a string' match = pattern.search(strdata) result = {} for need_group_name in need_group_names: result[need_group_name] = match.group(need_group_name) return result if __name__ == '__main__': for data in datas: match = pattern.search(data) print getdata(data)