python第7章:模式匹配与正则表达式

一、正则表达式基础

1、regex:是一种文本模式的描述方法

2、re.compile()向它传入一个字符串值,表示正则表达式,它将返回一个Regex模式对象(简称为Regex对象:正则对象)

3、Regex对象的search()方法查找传入的字符串,寻找正则表达式的所有匹配。没有找到返回None ,找到返回Match对象,该对象有一个group()方法,它返回被查找字符串中实际匹配的文本。

4、group() 1返回第一个匹配项,2返回第二个匹配项,0 或者不传入参数,返回整个文本。groups()返回所有的分组

5、\(和\)转移字符将匹配实际的括号字符

6、字符 | 称为管道,用于匹配许多表达式中的一个,或的关系。第一次出现的字符串就返回匹配结果,findall()方法将找到所有的匹配的地方

7、星号* 意味着匹配零次或者多次,即星号之前的分组,可以在文本中出现任意次数,0~无穷

8、加号+ 意味着匹配一次或者多次,至少一次匹配

9、花括号{3}:指定匹配的次数,{3,6}:最少3次,最多6次

10、Python的正则表达式默认是贪心算法,在没有二义的情况下,它们会尽可能的匹配最长的字符串。花括号的非贪心算法版本匹配尽可能端的字符串比如指定了{3},就算有4个也只会匹配3个

11、search()方法返回一个Match对象, 包括被查找的字符串中的“第一次”匹配的文本, findall()方法将返回一组字符串,包含被查找的字符串中的所有的匹配;另外,findall()方法返回的不是一个Match对象,而是一个字符串列表。有l两种情况,对于没有分组的正则表达式,返回列表中就是被查找的字符串,对于有分组的正则表达式,返回的是元组的列表

phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d') # has no groups
res =phoneNumRegex.findall('Cell:415-666-5555 work:212-555-5555')
print(res)


phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)') # has no groups
res =phoneNumRegex.findall('Cell:415-666-5555 work:212-555-5555')
print(res)

# the result is below:
['415-666-5555', '212-555-5555']
[('415', '666-5555'), ('212', '555-5555')]

12、正则表达式字符分类:\d :0--9的任何数字  \D:除了0--9数字之类的任何字符   \w:任何字符,数字或者下划线字符   \W:除了字符,数字和下划线之外的任何字符   \s:空格,制表符,换行符  \S:除了空格,制表符,换行符以外的任何字符 。

13、正则表达式网:https://www.regexpal.com/, https://www.cnblogs.com/cp-miao/p/5567115.html 等

13、用方括号[adcdefg]定义自己的字符分类,用来匹配字符串。

        [a-z0-9]:短横线表示字符或者数字的范围,在方括号内,普通的正则表达式符号不会被解释,所以不需要加上转移符号。

        在方括号的左侧加上[^abcdef]表示非字符类,也就是将匹配不在这个字符类中的所有字符。

14、在正则表达式开始位置使用^Hello,表示匹配必须发生在被查找文本开始处。 类似,在末尾添加Hello$表示该字符串必须以

这个正则表达式的模式结束。也可以两个符号同时使用。

15、正则表达式中:句点 "."字符称为通配符,它匹配除了换行之外的所有字符。但是句号点字符只能匹配一个字符。

        点和星连起来就可以匹配任意文本: " .* ":表示除了换行符外的其他任意文本,是一种贪心模式,总是匹配尽可能多的文本。

       如果要用非贪心模式:使用  .*?问号告诉python用非贪心模式进行匹配。

        re.DOTALL 作为re.compile()的第二个参数,可以让句点字符匹配所有的字符,包括换行符\n。

16、向re.compile()中传入第二个参数re.IGNORECASE或者re.I 让正则表达式不区分大小写进行匹配。

17、正则表达式知识汇总:

  1.  ?匹配零次或者一次前面的分组
  2. *匹配零次或者多次前面的分组
  3. +匹配一次或者多次前面的分组
  4. {n}匹配n次前面的分组
  5. {,m}匹配零次到m次前面的分组
  6. {n, }匹配n次到更多前面的分组
  7. {n,m}匹配至少n次,至多m次前面的分组
  8. {n,m}?或者*?或者+?对浅见的分组尽心非贪心的匹配
  9. ^spam意味着字符串必须以spam开始
  10. spam$意味着字符串必须以spam结束
  11. .点匹配除了换行符之外的所有字符
  12. \d  \w \s分别匹配数字,单词和空格 ,大写的字母情况下是相反匹配
  13. [abc]匹配方括号内的任意字符
  14. [^abc]匹配除了在方括号内的任意字符

18、Regex对象的sub()方法用于将找到的字符串用新的文本替换。传入两个参数,第一个参数是字符串,用于取代发现的匹配,第二个参数是一个字符串,即要替换的字符串。结果返回替换完成后的字符串。

nameRegex = re.compile(r'Agent \w+')
res = nameRegex.sub('CENSORED', 'Agent Alice gave the secrect documents to Agent Bot.')
print(res)


结果是:
CENSORED gave the secrect documents to CENSORED.

19、忽略正则表达式字符串中的空白符和注释,向re.cmpile()传入变量re.VERBOSE,作为第二个参数。

       使用管道符号| 将变量组合起来,作为第二个参数,在这里是按位或的关系

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值