Python re 模块应用(二) --- 匹配符

在前一篇文章里我们提到re模块可以用来做数据筛选与替换等功能,但是前述例子大多是利用现有的已知字符串如“abcd“在文本中进行匹配,但是对于未知的字符串,例如某网页中的全部的图片的下载连接,就没有办法解决了,这就需要用到re模块中匹配符或称模式匹配了。

具体来讲,模式匹配就是用于匹配具有某种具体结构或形式的字符串。常用的匹配符有:

'.'     匹配所有字符串,除\n以外
'-'     表示范围[0-9]
'*'     匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
'+'     匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+
'^'     匹配字符串开头
'$'     匹配字符串结尾 re
'\'     转义字符, 使后一个字符改变原来的意思,如果字符串中有字符*需要匹配,可以\*或者字符集[*]
'*'     匹配前面的字符0次或多次 
'?'     匹配前一个字符串0次或1次 
'{m}'   匹配前一个字符m次 
'{n,m}' 匹配前一个字符n到m次 
'\d'    匹配数字,等于[0-9] 
'\D'    匹配非数字,等于[^0-9]
'\w'    匹配字母和数字,等于[A-Za-z0-9]
'\W'    匹配非英文字母和数字,等于[^A-Za-z0-9] 
'\s'    匹配空白字符 
'\S'    匹配非空白字符 
'\A'    匹配字符串开头
'\Z'    匹配字符串结尾
'\b'    匹配单词的词首和词尾,单词被定义为一个字母数字序列,因此词尾是用空白符或非字母数字符来表示的
'\B'    与\b相反,只在当前位置不在单词边界时匹配
[]      是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字。[\s*]表示空格或者*号

贪婪模式和非贪婪模式

具体可参考
在模式匹配中通常包含贪婪模式非贪婪模式,所谓贪婪模式就是给出满足匹配符的情况下字符串内容最多的字符串,非贪婪模式是给出满足匹配符的情况下字符串内容最少的字符串,后面会举例说明;

两种模式最大的差别在于使用时,默认为贪婪模式,当需要非贪婪模式时,只需要在原有匹配字符的末尾加上一个“?“在网页的内容匹配中通常会用到以下两种匹配符:

(.*?):非贪婪模式,括号的用处在于返回匹配到的括号里面的内容,如,abdhwi-MM-abcd-aa-aa,利用MM(.*?)aa做匹配,返回的结果是-abcd-,对其的理解为,匹配MM开始无论遇到什么字符串直到第一个aa截止

import re
string = 'abdhwi-MM-abcd-aa-aa'
pat_1 = 'MM(.*?)aa'
print(re.findall(pat_1,string))
#['-abcd-']

(.*):非贪婪模式,同样的实例,输出结果为-abcd-aa-,匹配MM开始无论遇到什么字符串直到最后一个aa截止

pat_2 = 'MM(.*)aa'
print(re.findall(pat_2,string))
#['-abcd-aa-']

更多的例子:

#example1 匹配网址
string_1 = "IT面试题博客中包含很多 <a href=http://hi.baidu.com/mianshiti/blog/category> 微软面试题 </a>"
#匹配得到 " http://hi.baidu.com/mianshiti/blog/category"
#one methoed 
pat_3 = 'href=(.*?)>'
print(re.findall(pat_3,string_1))
#['http://hi.baidu.com/mianshiti/blog/category']


#example 2 匹配邮箱
string_2 = '[email protected]'
pat_5 = r"([a-zA-Z0-9_.]{3,8}@[a-pr-zA-PRZ0-9-]+\.\w{3})"
#含义:匹配大小写字母数字下划线以及其他符号3-8次+@+不含q的字母数字+.+3个结尾
print(re.findall(pat_5,string_2))
#['[email protected]']

# example 3 匹配电话号码
string_3 = 'werwjterjtyieyjieytel:12345678911fhewruigtytrbgTel:12345678912huwrefthweigrtptel:1233gifrdrwb'
pat_6 = '[Tt]el:([0-9]{11})'
print(re.findall(pat_6,string_3))
#['12345678911', '12345678912']

所有的源代码可以在我的GitHub上找到。关于re库的基本函数的用法在我的另一篇博客可以找到。

发布了6 篇原创文章 · 获赞 1 · 访问量 1800

猜你喜欢

转载自blog.csdn.net/msssssss/article/details/103842657