re模块

一、简介

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

 

二、正则表达式中常用的字符含义

1、普通字符和11个元字符:

 

普通字符
匹配自身
abc
abc
.
匹配任意除换行符"\n"外的字符(在re.DOTALL 模式中也能匹配换行符,简写re.S)
a.c
abc
\
转义字符,使后一个字符改变原来的意思
a\.c;a\\c
a.c;a\c
*
匹配前一个字符0或多次
abc*
ab;abccc
+
匹配前一个字符1次或无限次
abc+
abc;abccc
?
匹配一个字符0次或1次
abc?
ab;abc
^
匹配字符串开头。在多行模式中匹配每一行的开头 ^abc
abc
$
匹配字符串末尾,在多行模式中匹配每一行的末尾 abc$
abc
|

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

abc|def
abc
def
{} {m}匹配前一个字符m次,{m,n}匹配前一个字符m至n次,若省略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

2、预定义字符集表,可以写在字符集[...] 

\d  

\d匹配任何十进制数,它相当于类[0-9],\d+如果需要匹配一位或者多位数的数字时用

a\bc

a1c

\D   

\D匹配任何非数字字符,它相当于类[^0-9]

a\Dc

abc

\s

\s匹配任何空白字符,它相当于类[\t\n\r\f\v]

a\sc

a c

\S

\S匹配任何非空白字符,它相当于类[^\t\n\r\f\v]

a\Sc

abc

\w

\w匹配包括下划线在内任何字母数字字符,它相当于类[a-zA-Z0-9_]

a\wc

abc

\W

\W匹配非任何字母数字字符包括下划线在内,它相当于类[^a-zA-Z0-9_]

a\Wc

a c

\A

仅匹配字符串开头,同^

\Aabc

abc

\Z

仅匹配字符串结尾,同$

abc\Z

abc

\b

b匹配一个单词边界,也就是指单词和空格间的位置

\babc\b
a\b!bc

空格abc空格
a!bc

\B

[^\b]

a\Bbc

abc

3、特殊分组用法表:只对正则函数返回对象的有用

(?P<name>)   

?P<>定义组里匹配内容的key(键),<>里面写key名称,值就是匹配到的内容,

在用groupdict()方法打印字符串

(?P<id>abc){2}

abcabc

(?P=name)

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

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

1abc1

5abc5

\<number>

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

(\d)abc\1

1abc1

5abc5

4、正则匹配模式表

标志

含义

re.S(DOTALL)

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

re.I(IGNORECASE)

使匹配对大小写不敏感

re.L(LOCALE)

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

re.M(MULTILINE)

多行匹配,影响^和$

re.X(VERBOSE)

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

re.U

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

注意1:
  养成在正则表达式前加 r 的习惯,因为可以避免 \ 的影响
import re re.findall(r'a\nbc','a\nbc') ['a\nbc'] re.findall(r'a\\nbc','a\\nbc') ['a\\nbc'] re.findall(r'a\\\nbc','a\\\nbc') ['a\\\nbc']

注意2:

  re.findall(r“a.*bc”,”a\nbc”,re.DOTALL) 和 re.findall(r“a(.*)bc”,”a\nbc”,re.DOTALL)的区别?
  不分组时匹配的是全部,分组后匹配的是组内的内容,re.findall("a(.*?)b","str"),能够返回括号中的内容,括号前后的内容起到定位和过滤的效果

 注意3:点号默认情况匹配不到\n,需要指定re.S

 

 

参考:

1.https://www.cnblogs.com/zjltt/p/6955965.html

posted @ 2019-04-04 09:25  甜麦地  阅读(114)  评论(0)    收藏  举报