Python自学之路---Day13
Python自学之路---Day13
常用的三个方法
1.re.match(pattern, string, flags=0)
2.re.search(pattern, string, flags=0)
3.re.findall(pattern, string, flags=0)
| 原型 | re.match(pattern, string, flags=0) |
|---|---|
| 参数 | pattern:匹配的正则表达式 string :要匹配的字符串 flags :标志位,用于控制正则表达式的匹配方式 |
| 功能 | 1.尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成果也会返回None 2.扫描整个字符串,并返回第一个匹配成功的字符串 3.扫描整个字符串,并返回所有匹配成果的结果列表 |
flags参数说明:
| re.I | 忽略大小写 |
|---|---|
| re.L | 做本地化识别 |
| re.M | 多行匹配,影响^和$ |
| re.S | 使.匹配包括换行符在内的所有字符 |
| re.U | 根据Unicode字符集解析字符,影响\w \W \b \B |
| re.X | 使我们以更灵活的格式理解正则表达式 |
# re.match()
str1 = "www.baidu.com"
print(re.match("www", str1))
print(re.match("baidu", str1))
# 输出
<re.Match object; span=(0, 3), match='www'>
None
# re.search()
str1 = "www.baidu.com"
print(re.search("www", str1))
print(re.search("baidu", str1))
# 输出
<re.Match object; span=(0, 3), match='www'>
<re.Match object; span=(4, 9), match='baidu'>
# re.findall()
str1 = "www.baidu.com, www.baidu.com"
print(re.findall("www", str1))
print(re.findall("baidu", str1))
# 输出
['www', 'www']
['baidu', 'baidu']
匹配单个字符
| . | 匹配除换行符以外的任意字符 |
|---|---|
| [a, b , c] | 匹配 ‘a’ 或 ‘b’ 或 ‘c’ |
| [^…] | 匹配不在[ ]内的字符, 如[ ^abc]表示匹配除了’a’ ,‘b’, ‘c’ 这个三个字符以外的任意一个字符 |
| […-…] | 匹配[从-到]的内容,如[1-9] 表示匹配数字1到9 |
| \ | 反斜杠后面跟 元字符 去除 元字符的特殊功能,反斜杠后面跟 普通字符 实现 特殊功能 |
| \d | 匹配所有数字,类似[0-9] |
| \D | 匹配非数字字符 |
| \w | 匹配数字,字母和下划线,类似[0-9a-zA-Z_] |
| \W | 匹配非数字,字母和下划线,类似[ ^0-9a-zA-Z_] |
| \s | 匹配任意的空白符(空格,换行,换页,制表,回车),类似[ \f\n\r\t] |
| \S | 匹配任意的非空白符(空格,换行,换页,制表,回车),类似[^ \f\n\r\t] |
print(re.findall("goo.", "good man dool man goom"))
print(re.findall("[abc]", "www.baidu.com"))
print(re.findall("[^abc]", "www.baidu.com"))
print(re.findall("[0-9]", "25se26d1s5e"))
print(re.findall("[0123456789]", "25se26d1s5e"))
print(re.findall("\d", "25se26**d1s5e"))
print(re.findall("\D", "25se26**d1s5e"))
print(re.findall("\w", "25se26**d1s5e"))
print(re.findall("\W", "25se26**d1s5e"))
#输出
['good', 'goom']
['b', 'a', 'c']
['w', 'w', 'w', '.', 'i', 'd', 'u', '.', 'o', 'm']
['2', '5', '2', '6', '1', '5']
['2', '5', '2', '6', '1', '5']
['2', '5', '2', '6', '1', '5']
['s', 'e', 'd', 's', 'e']
['2', '5', 's', 'e', '2', '6', 'd', '1', 's', '5', 'e']
['*', '*']
边界匹配
| ^ | 匹配字符串的开头,与[ ]里的^不是一个意思 |
|---|---|
| $ | 匹配字符串的结尾 |
| \A | 匹配字符串开头,和^的区别是它只匹配整个字符串的开头,即使在re.M模式下也不会匹配其他行的行首 |
| \Z | 匹配字符串结尾,和$的区别是它只匹配整个字符串的结尾,即使在re.M模式下也不会匹配其他行的结尾 |
| \b | 匹配\w作为边界的内容 |
| \B | 匹配非\w与\W之间的内容 |
print(re.search("^www", "www.baidu.com")) # ^
print(re.search("^www", "w.baidu.com"))
print(re.search("com$", "www.baidu.com")) # $
print(re.search("com$", "www.baidu.comm"))
print(re.search("ww\w", "www.baidu.com")) # \b
print(re.search("www\w", "www.baidu.com"))
print(re.search("www\W", "www.baidu.com")) # \B
print(re.search("www.\W", "www.baidu.com"))
# 输出
<re.Match object; span=(0, 3), match='www'>
None
<re.Match object; span=(10, 13), match='com'>
None
<re.Match object; span=(0, 3), match='www'>
None
<re.Match object; span=(0, 4), match='www.'>
None
数量匹配
| * | 匹配前一个字符0次或无限次(贪婪) |
|---|---|
| + | 匹配前一个字符1次或无限次(贪婪) |
| ? | 匹配前一个字符0次或1次(非贪婪) |
| 匹配前一个字符m次 | |
| 匹配前一个字符m至n次。m,n可以省略,若省略m,则匹配0至n次;若省略n则匹配m至无限次(贪婪) | |
| *?+?{m,n}? | 可以使使其变为非贪婪匹配 |
print(re.findall("a*", "abaaa")) # *
print(re.findall("a+", "abaaa")) # +
print(re.findall("a?", "abaaa")) # ?
print(re.search("a{2}", "abaaa")) # {m}
print(re.search("a{2,4}", "abaaa")) # {m,n}
print(re.search("a{2,4}?", "abaaa")) # {m,n}?
# 输出
['a', '', 'aaa', '']
['a', 'aaa']
['a', '', 'a', 'a', 'a', '']
<re.Match object; span=(2, 4), match='aa'>
<re.Match object; span=(2, 5), match='aaa'>
<re.Match object; span=(2, 4), match='aa'>
逻辑与分组
| | | 匹配左右表达式的任意一个,如果|没有被包括在()内,则它的范围是整个表达式 |
|---|---|
| (...) | 被括起来的表达式将作为一个分组,从表达式左边开始每遇到一个左括号,编号+1.分组表达式作为一个整体,后面可以接数量词。表达式中的|仅在该组中有效 |
| (?P |
指定组的别名 |
print(re.search("www.baidu.com|WWW.BAIDU.COM", "www.baidu.com")) # |
print(re.search("www.baidu.com|WWW.BAIDU.COM", "WWW.BAIDU.COM"))
print(re.search("(w|W)ww.baidu.com", "www.baidu.com")) # ()
print(re.search("(w|W)ww.baidu.com", "Www.baidu.com"))
m = re.match(r"(?P<first>(\d{3})-(?P<last>\d{8}))", "010-52347654") # (?P<name>)
print(m.group(0)) # 使用序号获取对应组的信息,group(0)代表原始字符串
print(m.group(1))
print(m.group(2))
print(m.group("first"))
print(m.groups()) # 查看匹配的各组的情况
# 输出
<re.Match object; span=(0, 13), match='www.baidu.com'>
<re.Match object; span=(0, 13), match='WWW.BAIDU.COM'>
<re.Match object; span=(0, 13), match='www.baidu.com'>
<re.Match object; span=(0, 13), match='Www.baidu.com'>
010-52347654
010-52347654
010
010-52347654
('010-52347654', '010', '52347654')
编译正则表达式
编译:当使用正则表达式时,re模块会干两件事
1.编译正则表达式,如果正则表达式本身不合法会报错
2.用编译后的正则表达式去匹配对象
编译成正则对象,在调用是就会省去原来的正则表达式参数
pat = r"^1(([3578]\d)|(47))\d{8}$" # 正则表达式
print(re.match(pat, "13600000000"))
re_telephone = re.compile(pat) # 编译
print(re_telephone.match("13600000000"))
# 输出
<re.Match object; span=(0, 11), match='13600000000'>
<re.Match object; span=(0, 11), match='13600000000'>
其他方法
re.split(pattern, string, maxsplit=0, flags=0)
该方法作用类似于字符串的split()方法,但是由于加入了正则表达式,所以更好用,更精确
str1 = "sunck is a good man"
print(str1.split(" "))
print(re.split(r" +", str1))
# 输出
['sunck', '', '', '', '', '', '', '', '', 'is', 'a', 'good', 'man']
['sunck', 'is', 'a', 'good', 'man']
re.sub(pattern, repl, string, count=0, flags=0)
re.subn(pattern, repl, string, count=0, flags=0)
功能:在目标字符串中以正则表达式的规则匹配字符串,同时把他们替换成指定的字符串,默认替换次数为替换所有
区别:前者返回一个修改后的字符串,后者返回一个元组(修改后的字符串, 被替换的次数)
str3 = "www.baidu.com, www.sina.com, www.rnake.com"
print(re.sub(r"www", "ppp", str3))
print(type(re.sub(r"www", "ppp", str3)))
print(re.subn(r"www", "ppp", str3))
print(type(re.subn(r"www", "ppp", str3)))
# 输出
ppp.baidu.com, ppp.sina.com, ppp.rnake.com
<class 'str'>
('ppp.baidu.com, ppp.sina.com, ppp.rnake.com', 3)
<class 'tuple'>

浙公网安备 33010602011771号