《Python编程快速上手 让繁琐工作自动化 第2版》读后感2——第7章 模式匹配与正则表达式
本章篇幅较大,作者细致阐述了通过正则表达式进行字符串中匹配搜索的方法和技巧,对于Regex的使用有很大的帮助。
习题
- 创建Regex对象的函数是什么?
答:
通过re.compile()创建Regex对象。
- 在创建Regex对象时,为什么常用原始字符串?
答:
原始字符串可以简化正则表达式中转义字符的使用。
- search()方法返回什么?
答:
search()方法返回一个Match对象。
- 通过Match对象如何得到匹配该模式的实际字符串?
答:
Match对象中有一个group()方法,它返回被查找字符串中实际匹配的文本
- 在用r'(\d\d\d)-(\d\d\d-\d\d\d\d)'创建的正则表达式中,分组0表示什么?分组1表示什么?分组2表示什么?
答:
分组0返回整个匹配的文本,分组1返回第一个括号匹配的文本,分组2返回第2个括号匹配的文本。
- 括号和句点在正则表达式语法中有特殊的含义。如何指定正则表达式匹配真正的括号和句点字符?
答:
在正则表达式中,括号表示分组。句点为通配字符,他匹配除换行符之外的所有字符。为了匹配真正的括号和句点需要使用倒斜杠转义,\( \) \.
- findall()方法返回一个字符串的列表或字符串的元组的列表。是什么决定它提供哪种返回?
答:
如果正则表达式中没有分组,findall()方法返回字符串列表,如果正则表达式中存在,findall()方法返回字符串元组的列表。
- 在正则表达式中,|字符表示什么意思?
答:
正则表达式中,“|” 符号称为“管道”,可以完成匹配许多表达式中的一个。
- 在正则表达式中,?字符有哪两种含义?
答:
在正则表达式中,?字符声明非贪心匹配或表示可选的分组。
- 在正则表达式中,+和*字符之间的区别是什么?
答:
在正则表达式中,*意味着“匹配零次或多次”,+(加号)则意味着“匹配一次或多次”。
- 在正则表达式中,{3}和{3,5}之间的区别是什么?
答:
在正则表达式中,{3}表示匹配3次,{3,5}表示匹配3次、4次和5次之间的任何一种 。
- 在正则表达式中,\d、\w和\s缩写字符类是什么意思?
答:
在正则表达式中,\d表示0~9的任何数字;\w表示任何字母、数字或下划线字符(可以认为是匹配“单词”字符);\s表示空格、制表符或换行符(可以认为是匹配“空白”字符)。
- 在正则表达式中,\D、\W和\S缩写字符类是什么意思?
答:
在正则表达式中,\D表示除0~9的数字以外的任何字符;\W表示除字母、数字和下划线以外的任何字符;\S表示除空格、制表符和换行符以外的任何字符。
14..*和*?之间的区别是什么?
答:
.*表示任意文本;*?表示非贪心模式匹配0次或多次。
- 匹配所有数字和小写字母的字符分类语法是什么?
答:
[0-9a-z]
- 如何让正则表达式不区分大小写?
答:
可以向re.compile()传入re.IGNORECASE或re.I作为第二个参数。
- 字符.通常匹配什么?如果re.DOTALL作为第二个参数传递给re.compile(),它会匹配什么?
答:
“.”字符匹配除换行符外的所有字符,如果re.DOTALL作为第二个参数传递给re.comple(),将会匹配所有字符包括换行符。
- 如果numRegex = re.compile(r'\d+'),那么numRegex.sub('X', '12, drummers, 11 pipers, five rings, 3 hens')返回什么?
答:
返回字符串“X,drummers,X pipers,five rings,X hens”
- 将re.VERBOSE作为第二个参数传递给re.compile(),让你能做什么?
答:
当匹配复杂的文本模式,可能需要长的、令人费解的正则表达式。将re.VERBOSE作为第二个参数传递给re.compile(),忽略正则表达式字符串中的空白符和注释,从而缓解这一点
20.写一个正则表达式匹配每3位就有一个逗号的数字。它必须匹配以下数字:
但不会匹配以下数字:
- '12,34,567'(逗号之间只有两位数字)
- '1234'(缺少逗号)
答:
re.compile(r'''
(?<![\d|,])\d{1,3}(?=\s) #匹配只有1-3位数,左边
|
(?<![\d|,])\d{1,3}(?:,\d{3})+(?=\s) #匹配带有","的情况
''', re.VERBOSE)
21.写一个正则表达式匹配姓为Nakamoto的完整姓名。你可以假定名字总是出现在
姓前面,是一个大写字母开头的单词。该正则表达式必须匹配:
- 'Satoshi Nakamoto'
- 'Alice Nakamoto'
- 'RoboCop Nakamoto'
但不匹配:
- 'satoshi Nakamoto'(名字没有首字母大写)
- 'Mr. Nakamoto'(前面的单词包含非字母字符)
- 'Nakamoto'(没有名字)
- 'Satoshi nakamoto'(姓没有首字母大写)
答:
re.compile(r'[A-Z][a-zA-Z]*\sNakamoto')
22.编写一个正则表达式来匹配一个句子,它的第一个词是Alice、Bob或Carol,第
二个词是eats、pets或throws,第三个词是apples、cats或baseballs。该句子以句点结束。这个正则表达式不区分大小写。它必须匹配:
- 'Alice eats apples.'
- 'Bob pets cats.'
- 'Carol throws baseballs.'
- 'Alice throws Apples.'
- 'BOB EATS CATS.'
但不匹配:
- 'RoboCop eats apples.'
- 'ALICE THROWS FOOTBALLS.'
- 'Carol eats 7 cats.'
答:
re.compile(r'''((?:Alice|Bob|Carol)\s(?:eats|pets|throws)\s(?:apples|cats|baseballs)\.)''', re.VERBOSE | re.I)
本文来自论坛,点击查看完整帖子内容。