首页 > 其他 > 详细

re模块与正则表达式

时间:2019-04-14 15:02:56      阅读:144      评论:0      收藏:0      [点我收藏+]

1.正则表达式

   官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定的字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一                         种过滤逻辑。

   常见的元字符:

元字符  

           匹配内容  

   .

 匹配换行符以外的任意字符  

  \w

  匹配字母或数字或下划线

   \s

  匹配任意空白符

    \d

  匹配数字

    \n

  匹配一个换行符

    \t

  匹配一个制表符

    \b

  匹配一个单词的结尾

     ^

  匹配字符串的开始

     $

   匹配字符串的结尾  

    \W

   匹配非字母或数字或下划线

    \D

    匹配非数字

     \S

    匹配非空白字符串

    a|b

    匹配字符a或字符b

     ()

     匹配括号内的表达式,也表示一个组

    [...]

    匹配字符组中的字符

    [^...]     匹配除了字符组中字符的所有字符

     量词:

  量词  

     用法说明   

    *

  重复零次或更多次  

    +

  重复一次或更多次

    ?

  重复零次或一次

    {n}

  重复n次

    {n,}

  重复n次或更多次

    {n,m}  

  重复n到m次

 

     贪婪匹配:在满足匹配时,匹配尽可能长的字符,默认情况下,采用贪婪匹配。

    几个常用的非贪婪匹配:

     *?  重复任意次,但尽可能少重复。

     +? 重复1次或更多次,但尽可能少重复。

     ?? 重复0次或1次,但尽可能少重复。

     {n,m}?  重复n到m次,但尽可能少重复。

     {n,}?    重复n次以上,但尽可能少重复。

     .*?的用法:

.    是任意字符
*   是取0至无限长度
?   是非贪婪模式。
合在一起就是取尽量少的任意字符,一般不会单独写,大多用在:
.*?x                 就是取前面任意长度的字符,直到一个x出现。

 2.re模块下的常用方法

   findall ---------- 返回所有满足匹配条件的结果,放在列表中。

import re
a = re.findall([a-z]+, this is why we play)
print(a)

  技术分享图片

    search ---------- 从前往后,找到一个就返回,返回的变量需要调用group才能拿到结果。

import re
a = re.search(a, this is why we play)
if a:
    print(a.group())

 技术分享图片

    math ----------- 从头开始匹配,如果正则规则从头开始可以匹配上就返回一个变量。

import re
a = re.match(e, this is why we play)  # 头上并没有匹配的
if a:
    print(a.group())

 技术分享图片

    split 

import re
a = re.split([ab], abcd)  # 先按‘a‘分割得到‘‘和‘bcd‘在对‘‘和‘bcd‘分别按‘b‘分割。
print(a)

     sub -------------- 将数字替换成‘H‘,参数1表示只替换一个。

import re
a = re.sub(\d, H, this1 is2 why3 we4 play, 1) 
print(a)

 技术分享图片

   subn ---------- 将数字替换成‘H‘,返回元组(替换的结果,替换了多少次)

import re
a = re.subn(\d, H, this1 is2 why3 we4 play)
print(a)

 技术分享图片

compile ------ 函数将一个字符串编译为字节代码。

import re
a = re.compile(\d{3})
# 将正则表达式编译成为一个,正则表达式对象,规则要匹配的是三个数字。
b = a.search(ahd253awd) # 正则表达式对象调用search,参数为待匹配的字符串。
print(b.group())

 技术分享图片

finditer

import re
ret = re.finditer(\d, ds3sy4784a)   #finditer返回一个存放匹配结果的迭代器
print(ret)  # <callable_iterator object at 0x10195f940>
print(next(ret).group())  #查看第一个结果
print(next(ret).group())  #查看第二个结果
print([i.group() for i in ret])  #查看剩余的左右结果

 技术分享图片

 findall查询优先级:

a = re.findall(www.(baidu|cnblogs).com, www.baidu,com)
print(a)

b = re.findall(www.(?:baidu|cnblogs).com, www.baidu.com)
print(b)

 

 

 

技术分享图片

 我们会发现第一次返回的并不是我们想要的结果,那是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可。

 

split的优先级查询:

import re
a = re.split("\d+", "this1 is2 why3 we4 play")
print(a)

b = re.split("(\d+)", "this1 is2 why3 we4 play")
print(b)

技术分享图片

在匹配部分加上()之后所切出来的结果有所不同;没有括号的没有保留所匹配的项,但是有括号的却能够保留匹配的项。

re模块与正则表达式

原文:https://www.cnblogs.com/lal666/p/10695860.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!