一、介绍
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")