15.5 练习

正则表达式。根据要求写出练习15-1〜15-12相应的正则表达式

15-1.识别下列字符串:“bat”、“bit”、“but”、“hat”、“hit”或“hut”。

15-2.匹配用一个空格分隔的任意一对单词,比如名和姓。

15-3.匹配用一个逗号和一个空格分开的一个单词和一个字母。例如英文人名中的姓和名的首字母。

15-4.匹配所有合法的Python标识符。

15-5.请根据你(读者)本地关于地址的格式写法匹配一个街道地址(写出的正则表达式要尽可能通用以匹配任意数目的表示街道名字的单词,包括类型指示)。比如,美国的街道地址使用这样的格式:1180 Bordeaux Drive。使你写的正则表达式尽可能通用,要求能够匹配多个单词的街道名字,如:3120 De la Cruz Boulevard。

15-6.匹配简单的以“www.”开头,以“.com”作结尾的Web域名,例如:www.yahoo.com.

附加题:使你写的正则表达式还支持其他顶级域名如.edu、.net等比如www.ucsc.edu。

15-7.匹配全体Python整型的字符串表示形式的集合。

15-8.匹配全体Python长整型的字符串表示形式的集合。

15-9.匹配全体Python浮点型的字符串表示形式的集合。

15-10.匹配全体Python复数的字符串表示形式的集合。

15-11.匹配所有合法的电子邮件地址(先写出一个限制比较宽松的正则表达式,然后尽可能加强限制条件,但要保证功能的正确性)。

15-12.匹配所有合法的Web网站地址(URL)(先写出一个限制比较宽松的正则表达式,然后尽可能加强限制条件,但要保证功能的正确性)。

15-13.type().type()内建函数返回一个对象类型,此对象显示为Python的字符串形式,如下所示:

15.5 练习 - 图1

请写一个正则表达式,能从这个字符串中提取出类型的名字。你的函数能实现以下功能:如果以字符串“<type’int’>”做输入,会返回类型“int”(返回其他类型也同理,如,返回类型’float’,‘builtinfunctionormethod’等)。提示:正确的结果保存在类和某些内建类型的\_name属性里。

15-14.正则表达式。在15.2小节里,我们给出一个匹配由一位或两位数字代表一月到九月的字符串形式(“0?[1-9]”)。请写出一个正则表达式表示标准日历上其他的三个月(十月、十一月、十二月)。

15-15.正则表达式。在15.2小节里,我们给出一个匹配信用卡卡号的模式:(“[0-9]{15,16}”)。但这个模式不允许用连字符号分割信用卡卡号中的数字。请写出一个允许使用连字符的正则表达式,但要求连字符必须出现在正确的位置。例如,15位的信用卡卡号的格式是4-6-5,表示四个数字,一个连字符,后面接6个数字、1个连字符,最后是5个数字。16位的信用卡卡号的格式是4-4-4-4,数位不足时,添0补位。附加题:有一个用于确定某个信用卡卡号是否合法的算法。请写一段代码,它不但能识别格式正确的信用卡卡号,还能验证它的有效性。下面几个问题(练习15-16~15-27)专门处理gendata.py生成的数据。在做练习15-17和15-18之前,请先把练习15-16和所有正则表达式做出来。

15-16.修改脚本gendata.py的代码,使数据直接写入文件redata.txt中,而不是输出到屏幕上。

15-17.统计生成的redata.txt文件中,星期中的每一天出现的次数(或统计各月份出现的次数)。

15-18.通过检查每个输出行中整型字段部分的第一个整型是否和该行开头的时间戳相匹配来验证redata.txt中的数据是否完好。

根据各练习的要求写出相应的正则表达式。

15-19.提取出每行中完整的时间戳字段。

15-20.提取出每行中完整的电子邮件地址。

15-21.只提取出时间戳字段中的月份。

15-22.只提取出时间戳字段中的年份。

15-23.只提取出时间戳字段中的值(格式:HH:MM:SS)。

15-24.只从电子邮件地址中提取出登录名和域名(包括主域名和顶级域名,二者连在一起)。

15-25.只从电子邮件地址中提取出登录名和域名(包括主域名和顶级域名,二者分别提取)。

15-26.将每行中的电子邮件地址替换为你自己的电子邮件地址。

15-27.提取出时间戳中的月、日、年,并按照格式“月 日,年”显示出来,且每行仅遍历一次。

我们在小节15.2中使用的一个匹配电话号码的正则表达式,其中电话号码允许包含可选的区号前缀:\d{3}-\d{3}-\d{4}.请在练习15-28和15-29中,修改这个正则表达式,使它满足:

15-28.区号(第一组的三个数字和它后面的连字符)是可选的,即,你写的正则表达式对800-555-1212和555-1212都可以匹配。

15-29.区号中可以包含圆括号或是连字符,而且它们是可选的,就是说你写的正则表达式可以匹配800-555-1212、555-1212或(800)555-1212。