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次
{m,n} 匹配前一个字符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'>

最新文章

  1. 控制面板中java设置项如何删除
  2. java的事务处理
  3. 拓展开源库SwipeToLoadLayout实现EmptyView和Empty时自动禁用LoadMore
  4. 【Android】Activity遮罩效果的实现
  5. SQL Server 连接和事务相关的问题。
  6. MySQL的零碎知识点
  7. JAVA实现数据库数据导入/导出到Excel(POI)
  8. Kindle PaperWhite3 越狱和PDF插件的安装
  9. 创建银行API
  10. VB输出数据到EXCEL
  11. 关于Python课程的一些思考。
  12. Queue depth
  13. 来看看N多设计师笔下的Spider Man
  14. bzoj 2809 可并堆维护子树信息
  15. 在Unity场景中控制日夜的轮转
  16. 修改form 的字段背景颜色及字体颜色
  17. 定位性能问题的18个linux命令
  18. 400错误,Required String parameter &#39;paramter&#39; is not present
  19. linux shell判断脚本执行时传入了多少个参数,判断脚本参数个数,参数数量
  20. Sql server 0x80131904

热门文章

  1. phpstudy后门漏洞复现php5.2
  2. WARN No appenders could be found for logger 。。。。
  3. matlab练习程序(快速搜索随机树RRT)
  4. 063、Java中输出信息
  5. 011-PHP获取数组中的元素
  6. Educational Codeforces Round 63 选做
  7. face_recognition人脸识别
  8. NO14 快照-克隆-必须掌握的Linux目录结构
  9. Centos7安装mysql5.7.21
  10. ffmpeg “inttypes.h”: No such file or directory