正则表达式
需要引入一个名为re的包。Import re
1.首先建立一个模板对象,调用x=re.compile(模板) compile(编辑,编撰)
2.调用模板对象的search()函数,传入需要匹配的字符串。并返回一个对象。
mo=x.search("bdbfbdsbfdbdf456-789-12345")
- 调用对象的group()方法可以返回实际匹配的文本。 mo.group()
import re
x=re.compile(r'\d\d\d\-\d\d\d-\d\d\d\d\d')
mo=x.search("bdbfbdsbfdbdf456-789-12345")
print(mo.group())
返回456-789-12345
进阶
一 匹配更多模式
- 匹配分组 在正则表达式中建立分组
x=re.compile(r'(\d\d\d)-(\d\d\d)-(\d\d\d\d\d)')
如果\d多的话也可以用\d{n} 表示n个\d
这时间.group() 函数返回一个列表,分别是各个部分。
0 代表整体。1代表第一块
例子
import re
x=re.compile(r'(\d\d\d)-(\d\d\d)-(\d\d\d\d\d)')
mo=x.search("bdbfbdsbfdbdf456-789-12345")
print(mo.group())
print(mo.group(0))
print(mo.group(1))
print(mo.group(2))
结果
456-789-12345
456-789-12345
456
789
由于括号有特殊含义 所以如果需要匹配的有() 需要用\ 转义
import re
x=re.compile(r'(\(\d\d\d\))-(\d\d\d)-(\d\d\d\d\d)')
mo=x.search("bdbfbdsbfdbdf(456)-789-12345")
print(mo.group())
print(mo.group(0))
print(mo.group(1))
print(mo.group(2))
(456)-789-12345
(456)-789-12345
(456)
789
每一半( 都需要加\
(2)用管道匹配实现匹配到多个表达式其中的一个。用| 实现 注意:当找到第一个符合情况的就会返回
import re
x=re.compile(r'(\(\d\d\d\))|(\d\d\d)|(\d\d\d\d\d)')
mo=x.search("bdbfbdsbfdbdf(456)-789-12345")
print(mo.group())
print(mo.group(0))
print(mo.group(1))
print(mo.group(2))
(456)
(456)
(456)
None
- 可选匹配 用()? 实现。()可以出现1次 或0次
import re
x=re.compile(r'(\(\d\d\d\))?-(\d\d\d)-(\d\d\d\d\d)')
mo=x.search("bdbfbdsbfdbdf-789-12345")
print(mo.group())
print(mo.group(0))
print(mo.group(1))
print(mo.group(2))
-789-12345
-789-12345
None
789
import re
x=re.compile(r'(\(\d\d\d\))?-(\d\d\d)-(\d\d\d\d\d)')
mo=x.search("bdbfbdsbfdbdf(456)-789-12345")
print(mo.group())
print(mo.group(0))
print(mo.group(1))
print(mo.group(2))
(456)-789-12345
(456)-789-12345
(456)
789
- 用*匹配0次或多次。 ()* 在()中的元素可以出现0 次或多次
- 用+匹配1次或多次
- 用{}表示匹配的次数,传递多个参数表示或的意思{3,5}表示3或5次
五 贪心匹配
Python 匹配默认贪心匹配 在表示二意的情况下,尽可能匹配比较长的字符串
.search()匹配比较长的字符串
.search{} 匹配比较短的字符串
六 findall()方法
正常情况下,python将返回第一个满足条件的匹配,
使用findall将返回一个字符串列表 返回所有满足条件的匹配
字符分类 在建立模板时
\d 0到9 的数字
\D 0 到9 以外的任何字符
\w 任何字母,数字和下划线字符
\W 除字母,数字和下划线意外的任何字符
\s 空格,制表符或换行符
\S 除空格,制表符或换行符以外的任何字符
七:
^ 加在表达式开头:表示表示匹配必须发生在被查找文本的开始处。即必须以被查找文本开头
$ 加在表达式末尾:表示匹配的额表达式必须以被匹配的文字结尾
八:通配字符”.”
用在表达式之前表示一个字符
(.*)表示任意文本 且使用贪心匹配模式,他总是匹配尽可能多的文本
用{} 使用非贪心匹配。注意(.*)只匹配换行符之前的。
如果在re.compile()传入第二个参数 re.DOTALL 则会忽略换行符匹配所以的文本
? | 匹配1次或0次前面的分组 |
* | 匹配0次或多次前面的分组 |
+ | 匹配一次或多次前面的分组 |
{n} | 匹配n次前面的分组 |
{n,} | 匹配n次或者更多前面的分组 |
{,m} | 匹配0次到m次前面的分组 |
{n,m} | 匹配至少n次,至多m次前面的分组 |
^spam | 意味着字符串必须以spam开始 |
Spam$ | 意味着字符串必须以spam结束 |
. | 匹配所有字符,换行符号除外 |
\d,\w,\s | 分别匹配数字,单词,空格 |
\D,\W,\S | 分别匹配除数字,单词,空格以外的所有字符 |
[abc] | 匹配方括号内的任何字符 |
[^abc] | 匹配不再方括号内的任何字符 |
在re.compile 中传入re.DOTALL | 忽略换行符,匹配所有对象 |
在re.compile() 中传入re.I | 忽略大小写匹配 |
在re.compile() 中传入 re.VERBOSE | 忽略空白,注释 |
re包除了.search()之外还有.sub().将找到的字符串替换为()中的字符串。返回替换后的字符串