Python核心编程 第三版 - 正则表达式部分习题

运行下列脚本需要导入的模块

import os
import re
from random import choice, randrange
from string import ascii_lowercase as lc
from sys import maxsize
from time import ctime
from collections import Counter

1 - 择一匹配符的使用

pattern = r'[bh][aiu]t'
result = re.match(pattern, 'bat')
print(result.group())
result = re.match(pattern, 'hut')
print(result.group())

2 - 匹配单个空格分隔的任意单词对

pattern = r'([A-Za-z]+) ([A-Za-z]+)'
result = re.match(pattern, 'Hello World')
print(result.groups())

3 - 匹配单个逗号和单个空白符分隔的单词和字母

pattern = r'([A-Za-z]+), ([A-Za-z])'
result = re.match(pattern, 'Jonathan, Lim')
print(result.groups())

4 - Python标识符

pattern = r'[_A-Za-z][_A-Za-z0-9]+'
result = re.findall(pattern, '_helo __hello _ 34 34_naming naming naming____')
print(result)

6 - 匹配以www.开始,以.com|.net|.edu结尾的网址

pattern = r'www\.([A-Za-z0-9]+\.)+(com|net|edu|cn)'
result = re.match(pattern, 'www.baidu.com')
print(result.group())
result = re.match(pattern, 'www.upc.edn.cn')
print(result.group())

13 - 根据类型字符串吗,提取类型。类型可以通过type()来获取,python2中,类型字符串的格式为<type 'xxx'>;Python3中,类型字符串的格式为<class 'xxx'>

pattern = r'''<(type|class) '(\w+)'>'''
result = re.match(pattern, str(type('')))
print(result.group(2))

14 - 匹配月份

pattern = r'0?[1-9]$|1[0-2]$'
result = re.match(pattern, '03')
print(result.group())
result = re.match(pattern, '12')
print(result.group())

15 - 处理信用卡号码。美国信用卡是由15或者16位数字组成。格式可以是:4-6-5或者是4-4-4-4

pattern = r'\d{4}-\d{6}-\d{5}|(\d{4}-){3}\d{4}'
result = re.match(pattern, '4345-456278-34234')
print(result.group())
result = re.match(pattern, '4345-6278-3423-9909')
print(result.group())

16 - 为gendata.py更新代码,使得结果输出到redata.txt上

tlds = ('com', 'edu', 'net', 'org', 'gov')
with open('redata.txt', 'at') as file:
    for i in range(randrange(5, 11)):
        dtint = randrange(maxsize)  # pick date (seconds from 'epoch')
        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(llen))
        print('%s::%s@%s.%s::%d-%d-%d' % (dtstr, login, dom, choice(tlds), dtint, llen, dlen), file=file)

def read_textfile(filename):
    with open(filename, 'rt') as file:
        return file.readlines().__str__()

17 - 统计redata.txt.中,一周的每一天出现的次数

pattern = r'(^\w{3})'
resultDic = Counter()
with open('redata.txt', 'rt') as file:
    for line in file:
        key = re.match(pattern, line).group(1)
        resultDic[key] += 1
print(resultDic)

19 - 提取每行中完整的时间戳

pattern = r'(\w{3} \w{3} \d?\d \d{2}:\d{2}:\d{2} \d{4})'
result = re.findall(pattern, read_textfile('redata.txt'))
print(result)

20 - 提取每行中完整的邮件地址

pattern = r'(\w+@\w+\.(edu|com|net|org|gov))'
result = re.findall(pattern, read_textfile('redata.txt'))
print(result)

21 - 仅仅提取时间戳中的月份

pattern = r'\w{3} (\w{3}) \d?\d'
result = re.findall(pattern, read_textfile('redata.txt'))
print(result)

22 - 仅仅提取时间戳中的年份

pattern = r'\d{4}'
result = re.findall(pattern, read_textfile('redata.txt'))
print(result)

23 - 仅仅提取时间戳中的时间

pattern = r'\d\d:\d\d:\d\d'
result = re.findall(pattern, read_textfile('redata.txt'))
print(result)

24 - 仅仅从电子邮件地址中提取登录名和域名 (主域名和高级域名)

pattern = r'::(\w+)@(\w+\.\w+)::'
result = re.findall(pattern, read_textfile('redata.txt'))
print(result)

25 - 仅仅从电子邮件地址中提取登录名和域名

pattern = r'::(\w+)@(\w+)\.\w+::'
result = re.findall(pattern, read_textfile('redata.txt'))
print(result)

26 - 使用你的电子邮件替换每一行数据中的电子邮件地址

pattern = r'\w+@\w+\.(edu|com|net|org|gov)'
result = re.sub(pattern, 'jonlimx@hotmail.com', read_textfile('redata.txt'))
print(result)

27 - 从时间戳中提取月,日和年,然后以“月,日,年”的格式,每一行仅仅迭代一次

pattern = r'(?P<month>\w{3}) (?P<day>\w{3})'
with open('redata.txt', 'rt') as file:
    for line in file:
        result = re.sub(pattern, '\g<day> \g<month>', line)
        print(result)

os.remove('redata.txt')

28, 29 - 处理电话号码,格式为:三位数字区号 - 三位数字 - 四位数字,需要满足以下两个条件:
1. 区号可以省略,也就是可以匹配 800-555-1212,也能匹配555-1212
2. 支持使用圆括号或者连字符连接区号,也就是可以匹配800-555-1212, 555-1212以及(800) 555-1212

pattern = r'(\(?\d{3}\)?[-\s])?(\d{3})-(\d{4})'
print(re.match(pattern, '800-555-1212').group())
print(re.match(pattern, '555-1212').group())
print(re.match(pattern, '(800) 555-1212').group())
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339

推荐阅读更多精彩内容

  • 1. 识别后续的字符串:“bat”,“bit”,“but”,“hat”,“hit”或者“hut”。 2. 匹配由单...
    小奚有话说阅读 2,004评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,555评论 18 139
  • 经济适用房与限价房作为政策性住房往往被购房者混淆。经济适用房与限价房子在很多方面都存在差异,购房时需特别注意,否则...
    在5阅读 158评论 0 0
  • 有人说青蛇很好看,以前看以为只是情欲的妖娆,男女的诱惑,今天看完才知道原来有泪点。 文|念仔 妖娆的王祖贤演出白蛇...
    刘小盗阅读 894评论 2 2