学习Python的re模块学习

时间:2021-06-14 22:40:38

Python的re模块适用于正则表达式的匹配操作,在Python爬虫中可以匹配到一些自己想要得到的网站信息,对于爬虫编程十分重要。

现在,我们先说一说正则表达式的操作元字符:

\ 正则表达式使用反斜杠" \ "来代表特殊形式或用作转义字符,这里跟Python的语法冲突,因此,Python用" \\\\ "表示正则表达式中的" \ ",因为正则表达式中如果要匹配" \ ",需要用\来转义,变成" \\ ",而Python语法中又需要对字符串中每一个\进行转义,所以就变成了" \\\\ "。
^ 匹配输入字符串的开始位置。
$ 匹配输入字符串的结束位置。
* 匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。
+ 匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等价于{0,1}。
{n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
{n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。
{n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。
? 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。
.点 匹配除“\n”之外的任何单个字符。
x|y 匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。
[xyz] 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。
[^xyz] 负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。
\d 匹配一个数字字符。等价于[0-9]。
\D 匹配一个非数字字符。等价于[^0-9]。
\n 匹配一个换行符。等价于\x0a和\cJ。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于[^ \f\n\r\t\v]。
\w 匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。
\W 匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
\num 匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。
\n 标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。


re模块函数:


1、 re.match(pattern,string,flags)

match() 函数只检查 RE 是否在字符串开始处匹配,而 search() 则是扫描整个字符串。

match() 只报告一次成功的匹配,它将从 0 处开始;如果匹配不是从 0 开始的,match() 将不会报告它。

匹配成功则返回一个Match Object对象


对于输出对象的处理,有一下方法和属性:

group() 返回被 RE 匹配的字符串
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元组包含匹配 (开始,结束) 的位置

***:group() 返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。

1. group()返回re整体匹配的字符串

2. group (n,m) 返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常



面给出几个例子对match提供的一些方法加以解释,代码如下

# -*- coding=utf-8 -*-
import re
m=re.match(r'(\w+) (\w+)(?P<char>.*)','hello world!')
print 'm.string',m.string
print 'm.start:',m.start()
print 'm.start:',m.start(2)
print 'm.end:',m.end()
print 'm.end:',m.end(2)
print 'm.pos:',m.pos
print 'm.endpos:',m.endpos
print 'm.group:',m.group(2)
print 'm.groupdict:',m.groupdict()
print 'm.lastgroup:',m.lastgroup
print 'm.lastindex',m.lastindex
print 'm.span:',m.span(2)
print 'm.span',m.span()
print 'm.re:',m.re
print m.expand(r'\2 \1 \3')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

运行结果:

m.start: 0
m.start: 0
m.end: 12
m.end: 11
m.pos: 0
m.endpos: 12
m.group: world
m.groupdict: {'char': '!'}
m.lastgroup: char
m.lastindex 3
m.span: (6, 11)
m.span (0, 12)
m.re: <_sre.SRE_Pattern object at 0x02669760>   #直接输出时也会显示这个
m.string hello world!
world hello !
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

结果分析: 
1.string是匹配时所用的文本 
2.start可以返回指定的组在字符串中开始匹配的位置,默认值为0 
3.end返回指定的组在字符串中开始匹配的位置,默认值为0 
4.pos,endpos用于返回起始和终止匹配位置 
5.group可以返回指定组的起始匹配位置 
6.groupdict返回有别名的组的别名为键、以该组截获的子串为值的字典,没有别名的组不包含在内。 
7.lastgroup返回最后一个被捕获的分组的别名。如果这个分组没有别名或者没有被捕获的分组,将为None。 
8.lastindex返回最后一个分组在文本中的索引 
9.span 返回(start(group), end(group)),即该组的起始和终止位置 
10.expand可以实现分组之间顺序的调整



2、 re.search(pattern,string,flags)

功能:在字符串内查找匹配,找到第一个匹配,返回Match Object,或None


re.match与re.search的区别: re.match只匹配字符串的开始 ,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而 re.search匹配整个字符串 ,直到找到一个匹配。


2、 re.sub(patern,repl,string,count,flags)

功能:替换字符串中的匹配项

下面一个例子将字符串中的空格 ' ' 替换成 '-' :  

 
  
import re
text
= " JGood is a handsome boy, he is cool, clever, and so on... "
print re.sub(r ' \s+ ' , ' - ' , text)

 re.sub的函数原型为:re.sub(pattern, repl, string, count)

其中第二个函数是替换后的字符串;本例中为'-'

第四个参数指替换个数。默认为0,表示每个匹配项都替换。



3、 re.spilt
功能:可以使用re.split来分割字符串,如:re.split(r'\s+', text);将字符串按空格分割成一个单词列表。


4、 re.findall
功能:可以获取字符串中所有匹配的字符串。如:re.findall(r'\w*oo\w*', text);获取字符串中,包含'oo'的所有单词。


5、 re.compile()
功能:可以把正则表达式编译成一个正则表达式对象。可以把那些经常使用的正则表达式编译成正则表达式对象,这样可以提高一定的效率。

例如:
import re
text
= "JGood is a handsome boy, he is cool, clever, and so on..."
regex
= re.compile(r'\w*oo\w*')
print regex.findall(text) #查找所有包含'oo'的单词
print regex.sub(lambda m: '[' + m.group(0) + ']', text) #将字符串中含有'oo'的单词用[]括起来。




大约就是以上那么多重要的re模块函数了,第一次自己写博客,借鉴了很多大佬的文档,也学到了很多有用的东西学习Python的re模块学习