正则表达式的用来完成一些 搜寻和匹配,
它有一些专用的字符和模式:http://www.runoob.com/python/python-reg-expressions.html
我们看一些常用的小案例:
正则表达式:
匹配对象以及group()和groups()方法
group()要么返回整个对象,要么根据要求返回特定的子组。groups()则仅返回一个包含
唯一或者全部子组的元组。如果没有子组的要求,那么当group()仍然返回整个匹配时,groups
()返回一个空字组。
使用match()方法匹配字符串
match()函数试图从字符串的起始部分对模式进行匹配,如果匹配成功,就返回一个匹配对象,
如果匹配失败,就返回None,用group()来显示匹配成功的内容
import re #导入re模块
m = re.match('foo','foo') #模式匹配字符串
if m is not None: #如果匹配成功,就输出匹配内容
print(m.group())
print(m)
结果:foo
<_sre.SRE_Match object; span=(0, 3), match='foo'> # 这里输出的是它匹配的范围和内容
相反:如果是错误就什么也不会输出 如:
m = re.match('foo','fot') #模式并不能匹配字符串
if m is not None:
print(m.group())
结果:为空
m = re.match('foo','food on the table')
print(m.group())
结果:foo
print(re.match('foo','food on the table').group())
结果:foo
使用search()在字符串中查找模式
m = re.search('foo','seafood')
if m is not None:
print(m.group()) #search()是搜寻 match()是匹配 他们的含义不同
print(m)
结果:foo
<_sre.SRE_Match object; span=(3, 6), match='foo'>
匹配多个字符串
使用了(|)符号,如:bat|bet|bit
bt = 'bat|bet|bit' #正则表达式模式:bat bet bit
m = re.match(bt,'bat') #'bat'是一个匹配
m = re.match(bt,'bat')
if m is not None:
print(m.group())
结果:bat
m = re.match(bt,'blt') #对于‘blt'没有匹配
if m is not None:
print(m.group())
结果:为无
m = re.match(bt,'He bit me') #不能匹配字符串
if m is not None:
print(m.group())
结果:为无
m = re.search(bt,'He bit me') #通过搜寻查找’bit'
if m is not None:
print(m.group())
结果:bit
匹配任何单个字符
(.)不能匹配一个换行符\n或者非字符,就是说一个空字符串
anyend = '.end'
m = re.match(anyend,'bend') #点号匹配‘b'
if m is not None:
print(m.group())
结果:bend
m = re.match(anyend,'end') #不匹配任何字符
if m is not None:
print(m.group())
结果:为无
m = re.match(anyend,'\nend') # 除了\n之外的任何字符
if m is not None:
print(m.group())
结果:为无
m = re.search('.end','The end.') #在搜寻中匹配
if m is not None:
print(m.group())
结果:' end' end前的空格也会输出
(\.)这个就不一样了,使用一个反斜杠对句点的功能进行转义
patt314 = '3.14' # 表示正则表达式的点号
pi_patt = '3\.14' #表示字面量的点号(dec.point)
m = re.match(pi_patt,'3.14') #精确匹配
if m is not None:
print(m.group())
结果:3.14
m = re.match(patt314,'3014') #点号匹配’0‘
if m is not None:
print(m.group())
结果:3014
m = re.match(patt314,'3.14') #点号匹配’.'
if m is not None:
print(m.group())
结果:3.14
创建字符集([])
看看 [cr][23][dp][o2]和r2d2|c3po 之间的差别 r2d2|c3po要比[cr][23][dp][o2]更严格
m = re.match('[cr][23][dp][o2]','c3po') #匹配’c3po'
if m is not None:
print(m.group())
结果:c3po
m = re.match('[cr][23][dp][o2]','c2do') #匹配'c2do'
if m is not None:
print(m.group())
结果:c2do
m = re.match('r2d2|c3po','c2do') #不匹配 'c2do'
if m is not None:
print(m.group())
结果:为无
m = re.match('r2d2|c3po','r2d2') #匹配'r2d2'
if m is not None:
print(m.group())
结果:r2d2
重复,特殊字符以及分组
patt = '\w+@(\w+\.)?\w+\.com' #\w 是匹配任何字面数字字符,与[A-Z a-z 0-9]相同
print(re.match(patt, 'nobody@xxx.com').group()) # .com前面可以有一个和两个名称
结果:nobody@xxx.com
patt = '\w+@(\w+\.)?\w+\.com'
print(re.match(patt, 'nobody@www.xxx.com').group())
结果:nobody@www.xxx.com
#将?换成 * 的对比
patt = '\w+@(\w+\.)*\w+\.com'
print(re.match(patt, 'nobody@www.xxx.yyy.zzz.com').group())
结果:nobody@www.xxx.yyy.zzz.com
#子组
m = re.match('(\w\w\w)-(\d\d\d)','abc-123')
print(m.group()) #完全匹配 abc-123
print(m.group(1)) #子组1 abc
print(m.group(2)) #子组2 123
print(m.groups()) #全部子组 ('abc', '123')
m = re.match('ab','ab') #没有字组
print(m.group()) #完全匹配 ab
print(m.groups()) #全部字组 ()
m = re.match('(ab)','ab') #一个字组
print(m.group()) #完全匹配 ab
print(m.group(1)) #子组1 ab
print(m.groups()) #全部子组 ('ab',)
m = re.match('(a)(b)','ab') #两个子组
print(m.group()) #完全匹配 ab
print(m.group(1)) #子组1 a
print(m.group(2)) #子组2 b
print(m.groups()) #全部子组 ('a','b')
m = re.match('(a(b))','ab') #两个子组
print(m.group()) #完全匹配 ab
print(m.group(1)) #子组1 ab
print(m.group(2)) #子组2 b
print(m.groups()) #全部子组 ('ab','b')
#匹配字符串的起始和结尾以及单词边界
m = re.search('^The','The end.') #匹配 ^起始的
if m is not None:
print(m.group()) # The
m = re.search('^The','end. The') #不作为起始
if m is not None:
print(m.group()) # None
m = re.search(r'\bthe','bite the dog') #在边界 \b 字符边界 和 \B相反
if m is not None:
print(m.group()) # the
m = re.search(r'\bthe','bitethe dog') #有边界
if m is not None:
print(m.group()) # None
m = re.search(r'\Bthe','bitethe dog') #在边界
if m is not None:
print(m.group()) #the
# 使用findall() findeter() 查找每一次出现的位置
与match() search()的不同之处在于,findall()总是返回一个列表,没有匹配返回一个空
列表,匹配成功列表将包含所有成功的部分从左到右输出
print(re.findall('car','car')) # ['car']
print(re.findall('car','scary')) # ['car']
print(re.findall('car','carry the barcardi to the car')) # ['car', 'car', 'car']
# 使用findall() findeter() 查找每一次出现的位置
print(re.findall('car','car')) # ['car']
print(re.findall('car','scary')) # ['car']
print(re.findall('car','carry the barcardi to the car')) # ['car', 'car', 'car']
s = 'This and that.'
print(re.findall(r'(th\w+) and (th\w+)',s,re.I)) # [('This', 'that')]
m = re.finditer(r'(th\w+) and (th\w+)',s)
if m is not None:
print(m) # <callable_iterator object at 0x03C85A90>