一、介绍

1、re模块

不同的语言均有使用正则表达式的方法,但各不相同。Python是通过re模块来实现的。

>>> import re
>>> re.search(r"test","hah test 123")
<_sre.SRE_Match object; span=(4, 8), match='test'>

search()方法用于在字符串中搜索正则表达式模式第一次出现的位置,这里找到了,匹配的位置是(7,12)。这里需要注意两点:

(1)第一个参数是正则表达式,也就是你要描述的搜索规则,需要使用原始字符串来写,因为这样可以避免很多不必要的麻烦

(2)找到后返回的返回值是以下标0开始的,这跟字符串一样。如果找不到返回None。

2、通配符

正则表达式所谓的通配符使用点号(.)来表示,他可以匹配除了换行符之外的任何字符:

>>> re.search(r".","I love china")
<_sre.SRE_Match object; span=(0, 1), match='I'>

3、反斜杠

想要消除一个字符的特殊功能,就在它前面加上反斜杠

>>> re.search(r"\.","I lo.ve china")
<_sre.SRE_Match object; span=(4, 5), match='.'>

反斜杠可以剥夺元字符(元字符就是拥有特殊能力的符号,例如点号.)的特殊能力。同时,反斜杠还可以使得普通字符拥有特殊能力,例如:\d表示0-9的字符。

如果反斜杠后面加上的是数字,那它还有两种用法:

如果是跟1-99,那么表示引用序号对应的子组所匹配的字符串

    首先,小括号(())本身就是一对元字符,被他么括起来的正则表达式称为一个子组,这是就可以把它当成一个整体,可以再后边对他进行引用。

>>> re.search(r"(abc)","abc")
<_sre.SRE_Match object; span=(0, 3), match='abc'>
>>> re.search(r"(abc)\1","abc")
>>> re.search(r"(abc)\1","abcabcaaa")
<_sre.SRE_Match object; span=(0, 6), match='abcabc'>

如果跟着的是数字0或者是三位数字,那么它是一个八进制数,表示的是这个八进制数对应的ASCII字符

>>> re.search(r"(abc)\060","abc0de")
# 八进制60对应的ASCII码是数字0
<_sre.SRE_Match object; span=(0, 4), match='abc0'>
>>> re.search(r"\141abc","aabcdef")
# 八进制141对应的ASCII码是字母a
<_sre.SRE_Match object; span=(0, 4), match='aabc'>

4、字符类

字符类中的任何一个字符匹配,就算匹配成功。在中括号中可以使用小横杠来表示范围

>>> re.search(r"[aeiou]","I lo.ve china")
<_sre.SRE_Match object; span=(3, 4), match='o'>
>>> re.search(r"[a-z]","I lo.ve china")
<_sre.SRE_Match object; span=(2, 3), match='l'>

5、重复匹配

用大括号对元字符来实现重复匹配的功能,重复的次数可以是一个取值范围

>>> re.search(r"a{3}","sssaaabb")
<_sre.SRE_Match object; span=(3, 6), match='aaa'>
>>> re.search(r"a{2,3}","sssaaabb")
<_sre.SRE_Match object; span=(3, 6), match='aaa'>

6、元字符

以下是正则表达式的所有元字符:

.    通配符

^    匹配字符串的开始    re.search(r"^abc","abchaha")

$   匹配字符串的结束位置    re.search(r"abc$","abchahabc")

 *    相当于{0,}

+    相当于{1,}

?    相当于{0,1}

{    }   表示范围

 [    ]    字符集合,被包围在里面的元字符都会失去特殊功能,在其中,小横杠(-)表示范围,反斜杠用于字符转义,脱字符(^)表示取反,大括号({})表示范围

\    解除元字符功能、将普通字符变成特殊字符

|    或者

(    )分组

7、反斜杠+普通字符=特殊含义

'\A'    只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的,相当于re.match('abc',"alexabc") 或^
'\Z'    匹配字符结尾,同$ 
'\d'    匹配数字0-9
'\D'    匹配非数字
'\w'    匹配[A-Za-z0-9]
'\W'    匹配非[A-Za-z0-9]
's'     匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'

二、匹配语法

re.match 从头开始匹配
re.search 匹配包含
re.findall 把所有匹配到的字符放到以列表中的元素返回
re.split 以匹配到的字符当做列表分隔符
re.sub 匹配字符并替换
re.fullmatch 全部匹配

如果需要重复使用某个正则表达式,那么可以先将该正则表达式编译成模式对象。使用re.comple()方法来进行编译:

>>> p = re.compile("[A-Z]")
>>> p.search("I Love China")
<_sre.SRE_Match object; span=(0, 1), match='I'>
>>> p.findall("I Love China")
['I', 'L', 'C']

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

从起始位置开始根据模型去字符串中匹配指定内容,匹配单个

  • pattern 正则表达式
  • string 要匹配的字符串
  • flags 标志位,用于控制正则表达式的匹配方式
import re
obj = re.match('\d+', '123uuasf')
if obj:
    print obj.group()

Flags标志符

re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
M(MULTILINE): 多行模式,改变'^'和'$'的行为
S(DOTALL): 改变'.'的行为,make the '.' special character match any character at all, including a newline; without this flag, '.' will match anything except a newline.
X(re.VERBOSE) 可以给你的表达式写注释,使其更可读,下面这2个意思一样

a = re.compile(r"""\d + # the integral part
                \. # the decimal point
                \d * # some fractional digits""", 
                re.X)

b = re.compile(r"\d+\.\d*")

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

根据模型去字符串中匹配指定内容,匹配单个

import re
obj = re.search('\d+', 'u123uu888asf')
if obj:
    print obj.group()

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

match and search均用于匹配单值,即:只能匹配字符串中的一个,如果想要匹配到字符串中所有符合条件的元素,则需要使用 findall。
 

import re
obj = re.findall('\d+', 'fa123uu888asf')
print obj

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

用于替换匹配的字符串,相比于str.replace功能更加强大

>>>re.sub('[a-z]+','sb','张三是abc123',)

>>> re.sub('\d+','|', 'tom22jerry33hehe55',count=2)
'tom|jerry|hehe'

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

>>>s='9-2*5/3+7/3*99/4*2998+10*568/14'
>>>re.split('[\*\-\/\+]',s)
['9', '2', '5', '3', '7', '3', '99', '4', '2998', '10', '568', '14']

>>> re.split('[\*\-\/\+]',s,3)
['9', '2', '5', '3+7/3*99/4*2998+10*568/14']

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

整个字符串匹配成功就返回re object, 否则返回None

re.fullmatch('\w+@\w+\.(com|cn|edu)',"1234@163.com")