匹配模式字符串不要有任何空格和变量,重要!重要!重要!
re
准备正则表达式
- 在正则表达式中,如果直接给出字符,就是精确匹配。
\d 可以匹配一个数字
\W 匹配非字母数字及下划线
\w 可以匹配一个字母或数字
\s 空格 - 要匹配变长的字符,在正则表达式中,用*表示任意个字符(包括0个),用+表示至少一个字符,用?表示0个或1个字符,用{n}表示n个字符,用{n,m}表示n-m个字符:
例:\d{3}\s+\d{3,8}
表示的意思:\d{3}表示匹配3个数字,例如’010’;\s可以匹配一个空格(也包括Tab等空白符),所以\s+表示至少有一个空格,例如匹配’ ‘,’ ‘等;\d{3,8}表示3-8个数字,例如’1234567’
re.match(r'\d{3}\-\d{3,8}', '021-12345')
- 要做更精确地匹配,可以用[]表示范围
例如:
[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线;[0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如'a100','0_Z','Py3000'等等;[a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;[a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'。^表示行的开头,^\d表示必须以数字开头。$表示行的结束,\d$表示必须以数字结束。py也可以匹配'python',但是加上^py$就变成了整行匹配,就只能匹配'py'了。
re.match(r'py', 'python')
Out[10]: <re.Match object; span=(0, 2), match='py'>
# 例子
>>> import re
>>> re.match(r'^\d{3}\-\d{3,8}$', '010-12345')
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>
>>> re.match(r'^\d{3}\-\d{3,8}$', '010 12345')
>>>
search
re.search 扫描整个字符串并返回第一个成功的匹配
"""
语法
re.search(pattern, string, flags=0)
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
匹配成功re.search方法返回一个匹配的对象,否则返回None。我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
"""
#!/usr/bin/python
import reline = "Cats are smarter than dogs";searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)if searchObj:print "searchObj.group() : ", searchObj.group()print "searchObj.group(1) : ", searchObj.group(1)print "searchObj.group(2) : ", searchObj.group(2)
else:print "Nothing found!!"
match
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
#!/usr/bin/python
import reline = "Cats are smarter than dogs";matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:print "match --> matchObj.group() : ", matchObj.group()
else:print "No match!!"matchObj = re.search( r'dogs', line, re.M|re.I)
if matchObj:print "search --> searchObj.group() : ", matchObj.group()
else:print "No match!!"
sub
Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。
"""
语法:re.sub(pattern, repl, string, count=0, flags=0)
参数:pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
"""
#!/usr/bin/python
# -*- coding: UTF-8 -*-import rephone = "2004-959-559 # 这是一个国外电话号码"# 删除字符串中的 Python注释
num = re.sub(r'#.*$', "", phone)
print "电话号码是: ", num# 删除非数字(-)的字符串
num = re.sub(r'\D', "", phone)
print "电话号码是 : ", num
以上实例执行结果如下:
电话号码是: 2004-959-559
电话号码是 : 2004959559
re.sub(r'^[0]{1,100}', '', test) #去掉开头的0
split
re.split
split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:
"""
re.split(pattern, string[, maxsplit=0, flags=0])
参数:参数 描述
pattern 匹配的正则表达式
string 要匹配的字符串。
maxsplit 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志
"""
import re
s='abc, abc, defg, dds'
re.split('(\W+)',s)
result:['abc', ', ', 'abc', ', ', 'defg', ', ', 'dds']
说明:\W匹配任何非单词字符import re
s='abc, abc, defg, dds'
re.split('(\W+)',s)
['abc', ', ', 'abc', ', ', 'defg', ', ', 'dds']
说明:如果加上括号,结果会同时返回去掉的值
string
split
不支持正则及多个切割符号,不感知空格的数量,比如用空格切割,会出现下面情况。
>>> s1="aa bb cc"
>>> s1.split(' ')
['aa', 'bb', '', 'cc']
spritlines
Python splitlines() 按照行(’\r’, ‘\r\n’, \n’)分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。
str1 = 'ab c\n\nde fg\rkl\r\n'
print str1.splitlines();str2 = 'ab c\n\nde fg\rkl\r\n'
print str2.splitlines(True)['ab c', '', 'de fg', 'kl']
['ab c\n', '\n', 'de fg\r', 'kl\r\n']
strip
Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
# re.match(pattern, string, flags=0)
#!/usr/bin/python
# -*- coding: UTF-8 -*-str = "00000003210Runoob01230000000";
print str.strip( '0' ); # 去除首尾字符 0str2 = " Runoob "; # 去除首尾空格
print str2.strip();
result:
3210Runoob0123
Runoob# 只要头尾包含有指定字符序列中的字符就删除:
#!/usr/bin/python
# -*- coding: UTF-8 -*-str = "123abcrunoob321"
print (str.strip( '12' )) # 字符序列为 12
3abcrunoob3
re.search().group()
import re
a = "123abc456"
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) #123abc456,返回整体
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1) #123
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2) #abc
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3) #456# 原文链接:https://blog.csdn.net/sinat_20174131/article/details/77769309
正则表达式中的三组括号把匹配结果分成三组
group() 同group(0)就是匹配正则表达式整体结果
group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。
没有匹配成功的,re.search()返回None