Python正则表达式之match和search函数的使用

By | February 26, 2018

今天学习的是 Python 正则表达式 re 模块的 match 和 search 函数/方法。

声明:

由于 Python 正则表达式系列是学习《Python核心编程 第3版》的笔记和心得,所以很多的举例都是来自书中,我也不知道这算不算侵权,所以如果您发现侵权,在发律师函之前请告知我,我会有删除侵权的部分,我不希望打官司,特此声明。

#!/usr/bin/python
#-*- coding: utf-8 -*-

import re

'''
re 模块函数的匹配对象
match 函数,从字符串的起端开始匹配,匹配成功返回匹配对象,否则,返回 None 值。
'''

m = re.match('foo', 'foo')
print m
if m is not None:
    print m.group() # foo

m = re.match('foo', 'food on the table')
print m
if m is not None:
    print m.group() # foo

# Python 面向对象特性
print re.match('foo', 'food on the table').group() # foo

# 不在开头匹配,故匹配失败。
m = re.match('foo', 'seafood')
print m # None
if m is not None: print m.group()

'''
re 模块的 search 函数:
在字符串中搜索第一次匹配到的子串,
不必要从字符串起始匹配
'''
m = re.search('foo', 'seafood')
print m
if m is not None: print  m.group() # foo


# 匹配多个字符串
# | 表示择一匹配符号,从左右多个模式选择其一。
# | 使得可以匹配多个字符串,而不仅是一个
bt = 'bat|bet|bit'
m = re.match(bt, 'bat')
print m
if m is not None: print m.group() # bat

m = re.match(bt, 'blt')
print m # None
if m is not None: print m.group()

# 这是匹配不是搜索,匹配从字符串起始进行匹配
# 所以匹配失败
m = re.match(bt, 'He bit me')
print m # None

# .(点) 匹配任何除换行符以外的单个字符
anyend = '.end'
m = re.match(anyend, 'bend')
print m
if m is not None: print m.group() # bend

m = re.match(anyend, 'end')
print m # None
if m is not None: print m.group()

# 点(.)不匹配换行符
m = re.match(anyend, '\nend')
print m # None
if m is not None: print m.group()

m = re.search('.end', 'The end.')
print m
if m is not None: print m.group() #  end

# 对句点进行转义
patt314 = '3.14'
# r 表示原始字符,不必要转义字符串的特殊字符
# 这里要明白,正则表达式的模式就是一串原始字符
# 这里的“特殊字符”指在正则模式中的特殊字符,
# 不表示字符串中的特殊字符。
pi_patt = r'3\.14'
m = re.match(pi_patt, '3.14')
print m
if m is not None: print m.group() # 3.14

m = re.match(patt314, '3014')
if m is not None: print m.group() # 3014

# patt314 中的点表示除换行符之外的其他字符
# 是正则表达式中的特殊符号
# 请区分字符串中的特殊符号和正则模式中的特殊符号
m = re.match(patt314, '3.14')
print m
if m is not None: print m.group() # 3.14


# 创建字符集
## [cr] 表示匹配 c 和 r 中的其中一个
m = re.match('[cr][23][dp][o2]','c3po')
print m
if m is not None: print m.group() # c3po

m = re.match('[cr][23][dp][o2]','c2do')
print m
if m is not None: print m.group() # c2do

'''
| 符号表示尽可能向左右分别匹配多一些字符,
直到遇到 | 或者字符串的边界(头尾),
比[]更严格
'''
m = re.match('r2d2|c3po', 'c2do')
print m # 上面的可以匹配到 c2do ,而这里为匹配不到,所以值为 None
if m is not None: print m.group()

m = re.match('r2d2|c3po', 'r2d2')
print m
if m is not None: print m.group() # r2d2

## 重复、特殊字符与分组
# 匹配电子邮件地址
'''
\w 匹配大小字字母和下划线_,相当于[a-zA-Z_]
? 表示匹配 0 次或者 1次
'''
patt = '\w+@(\w+\.)?\w+\.com'
# 匹配成功
print re.match(patt, 'nobody@xxx.com').group()

patt = '\w+@(\w+\.)*\w+\.com'
# 匹配成功
print re.match(patt, 'nobody@www.xxx.yyy.zzz.com').group()

m = re.match('\w\w\w-\d\d\d', 'abc-123')
print m
if m is not None: print m.group() # abc-123

m = re.match('\w\w\w-\d\d\d', 'abc-xyz')
print  m # None
if m is not None: print m.group()

# 取出子组
'''
子组:表示模式中的子匹配,其中匹配到的字符串会被保存。并且其可以通过 \N 被引用,N为第几个,如果有子组,则编号最小为 1。
m.group(),返回的是匹配到的全部字符串
m.group(1),返回的是第一个子组匹配到的字符串,
以此类推。
m.groups(),返回所有子组组成的无组
'''
m = re.match('(\w(\w\w))-(\d\d\d)', 'abc-123')
print m
print m.group() # abc-123
print m.group(1) # abc
print m.group(2) # bc
print m.group(3) # 123
print m.groups() # ('abc', 'bc', '123')


# 子组测试
print '子组测试'
m = re.match('ab','ab')
print m
print m.group() # ab
## 没有子组
print m.groups() # ()

m = re.match('(ab)', 'ab')
print m
print m.group() # ab
print m.group(1) # ab
print m.groups() # ('ab',)

m = re.match('(a)(b)', 'ab')
print m
print m.group() # ab
print m.group(1) # a
print m.group(2) # b
print m.groups() # ('a', 'b')

m = re.match('(a(b))', 'ab')
print m
print m.group() # ab
print m.group(1) # ab
print m.group(2) # b
print m.groups() # ('ab', 'b')

# 匹配字符串的起始和结尾以及单词边界
## ^ 匹配字符串起始
m = re.match('^The', 'The end.')
print m
if m is not None: print m.group() # The


m = re.search('^The', 'end. The')
print m # None
if m is not None: print m.group()

'''
\b 表示单词边界,无论在字符串开头,还是结尾,还是在字符串中间,都表示边界。
而 \B 表示单词非边界,具体看实例。
'''
m = re.search(r'\bthe', 'bite the dog')
print m
if m is not None:
    print m.group() # the
else:
    print 'None'

m = re.search(r'\bthe', 'bitethe dog')
print m # None
if m is not None: print m.group()

m = re.search(r'\Bthe', 'bitethe dog')
print m
if m is not None: print m.group() # the


# match 和 search 还可以是正则对象的方法,且看用法
# re.I,表示不区分大小写匹配
reg = re.compile('\w+@[a-z\-\.]+\.[a-z]{2,}', re.I)
m = reg.match('admin@navinxu.com')
print m
if m is not None: print m.group() # admin@navinxu.com
m = reg.match('ADMIN@navinxu.com')
print m
if m is not None: print m.group()

m = reg.match('admin@mail.navinxu.com')
print m
if m is not None: print m.group() # admin@mail.navinxu.com

Created On: 2018-02-26

鉴于本人的相关知识储备以及能力有限,本博客的观点和描述如有错漏或是有考虑不周到的地方还请多多包涵,也欢迎指正,一起学习,共同进步。如果本文对您有帮助,而且让您觉得值得为内容付费,那么就请赞助(打赏)一下本人,这不强制。打赏支持微信支付,方法是使劲地戳一下下方的“打赏”按钮,然后得到微信收款的二维码,再用微信支付扫一下,就像买菜那样。祝好!