Python全栈开发day6

1. 简介

       正则表达式本身是一种小型的、高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行。

2. 常用字符

普通字符

abc

匹配自身

abc

abc

元字符

.

匹配除换行符之外的任意字符

a.c

abc

 

转义字符,使后一个字符改变原来的意思

a.c

a.c

 

*

匹配前一个字符0或多次

abc*

ab,abc

 

+

匹配前一个字符1或多次

abc+

abc,abcc

 

?

匹配其前面的一个字符出现0-1

abc?

ab,abc

 

^

匹配字符串开头。在多行模式中匹配每一行的开头

^abc

abc

 

$

匹配字符串末尾,在多行模式中匹配每一行的末尾

abc$

abc

 

|

或关系,匹配|左右表达式任意一个,从左到右匹配,如果|没有包括在()中,则它的范围是整个正则表达式

abc|def

abcdef

 

{}

{m}匹配前一个字符m次,{m,n}匹配前一个字符mn次,若省略n,则匹配m至无限次

ab{1,2}c

abc

abbc

 

[]

字符集。对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc][a-c][^abc]表示取反,即非abc

所有特殊字符在字符集中都失去其原有的特殊含义。用反斜杠转义恢复特殊字符的特殊含义。

a[bcd]e

abe

ace

ade

 

     

 

()

被括起来的表达式将作为分组,从表达式左边开始每遇到一个分组的左括号“(”,编号+1.

分组表达式作为一个整体,可以后接数量词。表达式中的|仅在该组中有效。

(abc){2}

a(123|456)c

abcabc

a456c

python中反斜杠作用:

    反斜杠后边跟元字符去除特殊功能;(即将特殊字符转义成普通字符)

    反斜杠后边跟普通字符实现特殊功能;(即预定义字符

    引用序号对应的字组所匹配的字符串

1
2
3
>>>a=re.search(r'(tina)(fei)haha2','tinafeihahafeitinafeihahatina').group()
>>> print(a)
tinafeihahafei

3. 预定义字符(可以在字符集[]中匹配)

字符集

释义

列举

Result

d

任何十进制数字;[0-9]

ac

a1c

D

非数字:[^d]

aDc

abc

s

匹配任何空白字符:[<空格> fv]

asc

a c

S

非空白字符:[^s]

aSc

abc

w

匹配包括下划线在内的任何字符:[A-Za-z0-9_]

awc

abc

W

匹配非字母数字字符: [^a-zA-Z0-9],即匹配特殊字符

aWc

a c



匹配wW之间,即匹配单词边界匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'

abc

a!bc

空格abc空格

a!bc

B

[^]

aBbc

abc

A

仅匹配字符串开头,^

Aabc

abc

z

仅匹配字符串结尾,$

abc

abc

4. 特殊分组用法

(?P<name>)

分组,除了原有的编号外再指定一个额外的别名

(?P<id>abc){2}

abcabc

(?P=name)

引用别名为<name>的分组匹配到字符串

(?P<id>d)abc(?P=id)

1abc1

5abc5

<number>

引用编号为<number>的分组匹配到字符串

(d)abc1

1abc1

5abc5

5. re模块功能函数

      acompile()

      编译正则表达式模式,返回一个对象的模式。(即把常用的正则表达式编译成正则表达式对象)

    re.compile(pattern,flags=0)

    pattern  编译时用的表达式字符串。

    flags  编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,行匹配等。

常用的flags有:

标志

含义

re.S(DOTALL)

使.匹配包括换行在内的所有字符

re.IIGNORECASE

使匹配对大小写不敏感

re.LLOCALE

做本地化识别(locale-aware)匹配,法语等

re.M(MULTILINE)

多行匹配,影响^$

re.X(VERBOSE)

该标志通过给予更灵活的格式以便将正则表达式写得更易于理解

re.U

根据Unicode字符集解析字符,这个标志影响w,W,,B

      b.match()

       只匹配起始位置(起始位置是否可以匹配成功),匹配单个(匹配成功返回一个对象,未匹配成功返回None)

       match(pattern, string, flags=0)

           pattern 正则模型

           string  要匹配的字符串

           falgs  匹配模式

1
2
3
4
5
print(re.match('com','comwww.runcomoob').group())
print(re.match('com','Comwww.runcomoob',re.I).group())
执行结果如下:
com
com    

     分组提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来)

        r =re.match("h(w+).*(?P<name>d)$", origin)

          print(r.group())     # 获取匹配到的所有结果

          print(r.groups())    # 获取模型中匹配到的分组结果

          print(r.groupdict()) # 获取模型中匹配到的分组中所有执行了key的组

     c.search()

       re.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None

       re.search(pattern, string, flags=0)

1
2
3
print(re.search('dcom','www.4comrunoob.5com').group())
执行结果如下:
4com

       *注:matchsearch一旦匹配成功,就是一个match object对象,而match object对象有以下方法:

               group()返回被 RE 匹配的字符串

               start() 返回匹配开始的位置

               end() 返回匹配结束的位置

               span() 返回一个元组包含匹配 (开始,结束的位置

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

    d.findall()

       re.findall遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表

       获取非重复的匹配列表;如果有一个组则以列表形式返回,且每一个匹配均是字符串;如果模型中有多个组,则以列表形式返回,且每一个匹配均是元祖;

       空的匹配也会包含在结果中

       注意:re. finditer(pattern, string, flags=0) 迭代一次一次去取数据

    e.re.split()

           split 根据正则匹配分割字符串

           split(pattern, string, maxsplit=0,flags=0)

              pattern 正则模型

              string  要匹配的字符串

              maxsplit:指定分割次数

              flags  匹配模式

       

        分组后分割

          

     f.re.sub()  替换匹配成功的指定位置字符串

           sub(pattern, repl, string, count=0,flags=0)

              pattern 正则模型

              repl    要替换的字符串或可执行对象

              string 要匹配的字符串

              count   指定匹配个数

              flags   匹配模式

       

       re.subn()  返回成功的指定位置字符串以及替换的次数

6、贪婪匹配与非贪婪匹配

    *,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成非贪婪匹配

原文地址:https://www.cnblogs.com/opsedu/p/5604455.html