《python核心编程》——正则表达式学习笔记(课后练习)

1. 识别后续的字符串:“bat”,“bit”,“but”,“hat”,“hit”或者“hut”。

[bh][aiu]t

2. 匹配由单个空格分割的任意单词对,也就是姓和名。

[A-Za-z]+\s[A-Za-z]+

3. 匹配由单个逗号和单个空白符分隔的任何单词和单个字母,如姓氏的首字母

[A-Za-z]+,\s[A-Za-z]

4. 匹配所有的有效的Python标识符集合

[A-Za-z_]\w+     # 匹配任意以字母和下划线开头,标识符可以包括字母,下划线和数字。

5. 根据美国接到地址格式,匹配街道地址。美国街道地址使用如下格式:1180 Bordeaux Drive。使你的正则表达式足够灵活,以支持多单词的街道名称,如3120 De la Cruz Boulevard

\d+[a-zA-Z\s]+

6. 匹配以“www”起始且以“.com”结尾的简单Web域名:例如,www://www.yahoo.com。

^www[^\s]+[com|edu|net]$ 

7. 匹配所有能够表示Python整数的字符串集

[-+]?\d+            # 有正负符号或无

8. 匹配所有能够表示Python长整数的字符串集

[-+]?\d+[lL]        # 长整型,整数后面跟大写或小写的L

9. 匹配所有能够表示Python浮点数的字符串集

[-+]?\d+\.\d*

10. 表示所有能够表示Python复数的字符集

-?\d+\+[\+-]\d+j

11. 匹配所有能够表示有效电子邮件的集合

[^\s]+@(\w+\.?)+

12. 匹配所有能够表示有效网址的集合(URL)

(http://([A-Za-z0-9\-]+\.?)+)

13. 创建一个能从字符串中提取实际类型名称的正则表达式。函数将对于<type 'int'>字符串返回int

<type\s\'(\w+)\'>

14. 处理日期,常见一个正则表达式来表示标准日历中剩余三个月的数字

1[012]

15. 处理信用卡号码

(\d{4}-\d{6}-\d{5}|\d{4}-\d{4}-\d{4}-\d{4})

16. 为gendata.py更新代码,是数据直接输出到redata.txt而不是屏幕

# !/usr/bin/env python
# gendata.py

from random import randrange, choice
from string import ascii_lowercase as lc

# from sys import int
from time import ctime

tlds = ('com', 'edu', 'net', 'org', 'gov')
with open('path\redata.txt', 'w') as fp:
    for i in range(randrange(5,11)):
        dtint = randrange(2**32)                        # pick date
        dtstr = ctime(dtint)                            # date string
        llen = randrange(4, 8)                          # login is shorter
        login = ''.join(choice(lc) for j in range(llen))
        dlen = randrange(llen, 13)                      # domain is longer
        dom = ''.join(choice(lc) for j in range(dlen))
        print('%s::%s@%s.%s::%d-%d-%d' % (dtstr, login,
              dom, choice(tlds), dtint, llen, dlen))
        str = '%s::%s@%s.%s::%d-%d-%d' % (dtstr, login,
               dom, choice(tlds), dtint, llen, dlen)
        fp.write(str+'\n')

 

17. 判断redata.txt中一周的每一天出现的次数

import re

week = {"Mon": 0, "Tue": 0, "Wed": 0, "Thu": 0, "Fri": 0, "Sat": 0, "Sun": 0}

with open('path\redata.txt', 'r') as fp:
    data = fp.readlines()
    for line in data:
        day = re.match('^\w{3}', line)
        key = day.group()
        week[key] = week[key] + 1

print(week)

18. 提取

# 判断数据是否损坏Sat Jun 22 09:14:03 1985::
import re

with open('path\redata.txt', 'r') as fp:
    data = fp.readlines()
    for line in data:
        time = re.match('^\w{3}\s\w{3}\s{1,2}\d{1,2}\s\d{2}:\d{2}:\d{2}\s\d{4}', line)
        if time is not None:
            print('未损毁')
        else:
            print('存在数据损毁')

19-25. 创建正则表达式

# 19-27练习
import re


times = []
emails = []
months = []
years = []
clocks = []
lnames = []
dnames = []
with open('path\redata.txt', 'r') as fp:
    data = fp.readlines()
    for line in data:
        time = re.match('(\w{3}\s(\w{3})\s{1,2}\d{1,2}\s(\d{2}:\d{2}:\d{2})\s(\d{4}))::((\w+)@((\w+\.?)+))::', line)  # 提取时间戳
        if time is not None:
            times.append(time.group(1))            # 提取完整时间戳
            months.append(time.group(2))           # 提取月份
            years.append(time.group(4))            # 提取年份
            clocks.append(time.group(3))           # 提取时间
            emails.append(time.group(5))           # 提取邮件
            lnames.append(time.group(6))           # 提取登录名
            dnames.append(time.group(7))           # 提取域名
print('完整时间:', times)
print('月份:', months)
print('年份:', years)
print('时间点:', clocks)
print('邮件地址:', emails)
print('登录名:', lnames)
print('域名:', dnames)

结果:

26. 使用自己的电子邮件地址替换没一行数据中的电子邮件地址

import re

with open('path\redata2.txt', 'r') as fp:
    data = fp.readlines()
    for line in data:
        print(re.sub('\w+@(\w+.?)+', 'lullaby@163.com', line).rstrip())

结果:

27. 从时间戳中提取月、日、年,然后以“月、日、年”的格式。

import re

f = open('redata.txt','r')
with open('path\redata2.txt', 'r') as fp:
    data = fp.readlines()
    for line in data:
        m = re.match('^\w{3}\s(\w{3})\s{1,2}(\d{1,2})\s\d{2}:\d{2}:\d{2}\s(\d{4})', line)
        print('%s,%s,%s' % (m.group(1), m.group(2), m.group(3)))

结果:

 

posted @ 2018-04-28 16:06  LullabyT  阅读(836)  评论(0编辑  收藏  举报