阅读量

原创教程,严禁转载。引用本文,请署名 Python中文网, http://www.zglg.work


95 捕获子串

今天以我写过的《Python 60天》专栏中的一段文字,提取出里面的链接为例,阐述提取子串的实用性。

先贴上文字(有删减改动),将这段文字赋值给变量 urls

urls = """
基于 Python 的包更是枝繁叶茂,遍地开花,“Tiobe 编程语言排行榜”最新统计显示 Python 是增长最快的语言。

![image-20200131192231967](https://images.gitbook.cn/2020-02-05-014719.png)

接下来,与大家,还有远在美国做 AI 博士后研究的 Alicia,一起开始我们的 60 天 Python 探索之旅吧。

所有的这些考虑,都是为了让大家在短时间内掌握 Python 技术栈,多一个生存的本领。拿到理想的 Offer 后,早日过上自己想要的生活。

让我们开始吧。

如下,按照是否为静态/动态语言,弱类型/强类型两个维度,

总结常用的语言分类。

![image-20200205155429583](https://images.gitbook.cn/2020-02-05-080211.png) ### 四大基本语法
"""

你可能很快写出如下的正则表达式:

# 元字符.表示匹配除\n字符外的任意一个字符
# 元字符*表示匹配前面一个原子0次或多次
pat = r'https:.*' 

然后导入re模块,使用findall方法找出所有匹配:

import re
result = re.findall(pat,urls)
print(result)

运行结果显示如下,观察发现2个匹配,但是每个匹配链接都包括冗余字符,因此匹配错误:

['https://images.gitbook.cn
/2020-02-05-014719.png)',

'https://images.gitbook.cn
/2020-02-05-080211.png) ### 四大基本语法']

我们再稍微优化原正则表达式为:

# 添加 \) 表示待匹配子串以右括号结尾
pat = r'https:.*\)'

打印结果显示如下,结果确实好一点,但是依然包括右括号,结果还是错误的:

['https://images.gitbook.cn/
2020-02-05-014719.png)', 

'https://images.gitbook.cn/
2020-02-05-080211.png)']

所以掌握提取子串的技能就很重要,实现提取子串也很简单,只需把想要返回的子串加上一对括号就行,如下所示:

# 把想要返回的子串外面添加一对括号

pat = r'(https:.*)\)'

此时返回结果完全正确,无任何多余字符。想要返回的子串外面添加一对括号还有个专业叫法:捕获分组

上一个例子 下一个例子