Python之正则表达式

Posted 南云之苑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python之正则表达式相关的知识,希望对你有一定的参考价值。

Re一些规则

技术分享图片
技术分享图片
正则表达式在很多地方都是非常有用的,比如在写网络爬虫的时候,提取元素或者提取网址的时候有很大的作用。而正则表达式常用于字符串操作

字符匹配

1.元字符的完整列表:. ^ $ * + ? { [ ] \ | ( )
匹配“a,b,c中的一个字符”:[abc] 或者 [a-c]
2.一些常用的特殊符号

\d 匹配任何十进制数,相当于[0-9]
\D 匹配任何非数字字符,相当于[^0-9]
\s 匹配任何非空白字符,相当于[\t\n\r\f\v....]
\S 匹配任何非空白字符,相当于[^ \t\n\r\f\v...]
\w 匹配任何字母数字字符,相当于[a-zA-Z0-9]
\W 匹配任何非字母数字字符,相当于[^a-zA-Z0-9]

3.重复

  • “*”前一个字符可以被匹配零次或更多次,而不是只有一次
  • {m,n}限定符,表示至少有m个重复、至多有n个重复.

    eg.
    re.match(r'a/{2,4}b',a//b)=true
    re.match(r'a/{2,4}b',a/b)=false

python使用正则表达式

RegexObject实例:

方法/属性 作用
match() 决定re是否在字符串刚开始的位置匹配
search() 扫描字符串,找到这个re匹配的位置
findall() 找到re匹配的子串,并把它们作为一个列表返回
finditer() 找到re匹配的所有子串,并把它们作为一个迭代器返回

MatchObject实例:

方法/属性 作用
group() 返回被re匹配的字符串
start() 返回匹配开始的位置(索引)
end() 返回匹配结束的位置(索引)
span() 返回一个元组包含匹配(开始,结束)的位置
eg.
p = re.compile('\d+')
p.findall('1 hello,2 byebye,3 yes,4 no')
>>>['1','2','3','4']

一些提醒:
[^abc]表达的意思是匹配除了abc的任何一个字符;但是如果是^abc则表达的意思是匹配以‘abc‘开始的字符串
match()函数只检查re是否在字符串开始处匹配,而research()则是扫描整个字符串。如果匹配不是从字符串的位置0处开始的,match()将不会报告它。
From (\[email protected]\S+)表达的意思是从From开始匹配,但是提取的时候只提取括号内的内容。

贪婪匹配

默认的为贪婪匹配,意思是:

#我想匹配From:,所以可以用^F.+:进行匹配
p = re.match(r'^F.+:','From: using : it is')
print(p)
>>>From: using : 

从上述例子可以看出,一般匹配的时候都采用了贪婪匹配,即满足匹配规则的最长字符串;为了避免这个,需要将匹配规则写成‘r‘^F.+:?‘,其中?就是不进行贪婪匹配。

修改字符串

方法/属性 作用
split() 将字符串在re匹配的地方分片并生成一个列表
sub() 找到re匹配的所有子串,并将其用一个不同的字符串替换
subn() 与sun()相同,但返回新的字符串和替换次数

将字符串分片split()

p = re.compile(r'\W+')
p.split('This is a test')
>>> ['This','is','a','test','']

更高级一点的分片

往往我们需要的可能只是一个字符串里的字母或者数字,即相关数据提取;所以我们对于一些符号需要进行排除p.split(r‘(\s\,\.\#\\)ab*‘), 这样的格式就可以将一些符号进行排除,只正确分片出我们所需呀的关键信息。

搜索和替换sub()

sub(replacement,string[,count = 0])返回的字符串是在字符串中用re最左边不重复的匹配来替换,如果模式没有被发现,字符将被没有改变的返回。可选参数count是模式匹配后替换的最大次数;count必须是非负整数。缺省值是0表示替换所有的匹配。

eg.
p = re.compile('(blue|white|red)'))
p.sub('colour','blue socks and red shoes')
>>>colour socks and colour shoes.
p.sub('colour','blue socks and red shoes',count = 1)
>>>colour socks and red shoes

邮箱验证

虽然没有统一的邮箱账号格式,但是所有邮箱都符合“名称@域名”的规律。对于名称和域名的字符限制,我们可以根据项目的情况定义一个,比如只允许有英文、数字、下划线等组成。
举例:[email protected]
分析邮件名称部分

  • 26个大小写英文字母表示为a-zA-Z
  • 数字表示为0-9
  • 下划线表示为_
  • 中划线表示为-
  • 由于名称是由若干个字母、数字、下划线和中划线组成,所以需要用到+表示多次出现
    所以根据以上条件得出邮件名称表达式:[a-zA-Z0-9_-]+
    由于邮箱的基本格式为“名称@域名”,需要使用“^”匹配邮箱的开始部分,用“$”匹配邮箱结束部分以保证邮箱前后不能有其他字符,所以最终邮箱的正则表达式为:

^[a-zA-Z0-9_-][email protected][a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$

以上是关于Python之正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

python爬虫之小说网站--下载小说(正则表达式)

python爬虫之正则表达式

Python爬虫入门之正则表达式

Python爬虫入门七之正则表达式

python3爬虫之入门和正则表达式

Python100天精通指南 之 re正则表达式