1. 正则和 re 模块的联系
正则表达式是一种通用的用来简洁表达一组字符串的表达式,利用正则表达式可以方便快捷地匹配和筛选字符串。
举个例子:在一堆数据中寻找电话号码,我们需要根据特征进行查找。电话是 11 位数字,基于特征寻找。
正则的一些方法都放在 re 模块中。re 模块使 Python 语言拥有全部的正则表达式功能,提供了与这些方法功能完全一致的函数,使用一个模式字符串作为第一个参数。
Python 正则表达式通过 re 模块实现字符串匹配。主要方法包括 match(从头匹配)、search(任意位置匹配)、findall(获取所有匹配)。字符匹配涵盖 .、\d、\w 等,量词包括 *、+、{m,n} 及贪婪非贪婪模式。锚点 ^ 和 $ 用于指定起止位置,分组 () 提取子串。其他功能支持 compile 对象化、sub 替换、split 拆分及单词边界 \b 处理。掌握这些基础可高效处理文本数据清洗与爬虫任务。

正则表达式是一种通用的用来简洁表达一组字符串的表达式,利用正则表达式可以方便快捷地匹配和筛选字符串。
举个例子:在一堆数据中寻找电话号码,我们需要根据特征进行查找。电话是 11 位数字,基于特征寻找。
正则的一些方法都放在 re 模块中。re 模块使 Python 语言拥有全部的正则表达式功能,提供了与这些方法功能完全一致的函数,使用一个模式字符串作为第一个参数。
import re
正则在爬虫中很常见,在大量字符串中进行数据寻找。
例如匹配 11 位数字:\d{11}。
匹配手机号(第一位 1,第二位 3-9,后面 9 位数字):1[3-9]\d{9}。
re.match() 必须从字符串开头匹配。如果不是起始位置匹配成功,返回 None。
只会匹配一次数据。如果匹配失败返回 None,成功返回匹配的范围区间。
import re
r = re.match('test', 'testabcdfgsdtest')
print(r) # <re.Match object; span=(0, 4), match='test'>
r = re.match('test', 'Testabcdfgsdtest')
print(r) # None
获取匹配内容:
import re
r = re.match('test', 'testabcdfgsdtest')
print(r.group()) # test
获取匹配位置:
import re
r = re.match('test', 'testabcdfgsdtest')
print(r.span()) # (0, 4)
这里的 (0, 4) 是左闭右开区间。
re.search() 方法只在目标字符串中匹配一次满足条件的正则表达式,返回查找字符的位置。
不管在哪个位置都可以进行目标寻找,只匹配第一次满足条件的一串字符。
import re
r = re.search('test', 'tdestabcdfgsdtest')
print(r)
print(r.group())
print(r.span())
# <re.Match object; span=(13, 17), match='test'>
从字符串中匹配内容,进行多次匹配,有多少次满足项就匹配多少个。
返回结果以列表形式存储。
import re
r = re.findall('test', 'tdestabtestcdfgsdtest')
print(r) # ['test', 'test']
. 匹配任意字符,除了 。
import re
print(re.findall('.', 'test\tand\n')) # ['t', 'e', 's', 't', '\t', 'a', 'n', 'd']
可以将整个字符串拆分,将每个元素放到列表中。
r = re.match('aaa.', 'aaa1212bbb')
print(r.group()) # aaa1
将字符串中的数字提取出来。
import re
print(re.findall('\d', 'abd6c123')) # ['6', '1', '2', '3']
将字符串中的非数字匹配提取出来。
import re
print(re.findall('\D', 'abd6c123')) # ['a', 'b', 'd', 'c']
匹配空白字符。
import re
print(re.findall('\s', 'ted \t anfdsa sd ')) # [' ', '\t', ' ', ' ', ' ']
匹配非空白字符。
import re
print(re.findall('\S', 'ted \t anfdsa sd ')) # ['t', 'e', 'd', 'a', 'n', 'f', 'd', 's', 'a', 's', 'd']
匹配单词字符,如字母、数字、下划线、汉字。
import re
print(re.findall('\w', 'hi,小明!')) # ['h', 'i', '小', '明']
作用与 \w 相反。
import re
print(re.findall('\W', 'hi,小明!')) # [',', '!']
只会匹配括号内列举出来的,一次匹配一个。
import re
print(re.findall('[a-z]', 'hi,小明!123')) # ['h', 'i']
print(re.findall('[a-zA-Z]', 'hi,小明 DFS!123')) # ['h', 'i', 'D', 'F', 'S']
print(re.findall('[0-9]', 'hi,小明 DFS!123')) # ['1', '2', '3']
print(re.findall('[0-35-9]', 'hi,小明 DFS!124653')) # ['1', '2', '6', '5', '3']
匹配多个字符是基于单个字符的。
允许匹配 0 次,返回空白字符。
import re
print(re.findall('\S*', 'hi,my name is xiaoming')) # ['hi,my', '', 'name', '', 'is', '', 'xiaoming', '']
至少匹配 1 次,不会算上空格的。
import re
print(re.findall('\S+', 'hi,my name is xiaoming')) # ['hi,my', 'name', 'is', 'xiaoming']
长度至少是 m 才能进行匹配。
import re
print(re.findall('\d{3}', '1233456')) # ['123', '345']
import re
print(re.findall('\S{4,}', 'hi,my name is xiaoming')) # ['hi,my', 'name', 'xiaoming']
至少匹配 m 次,最多匹配 n 次。
import re
print(re.findall('\S{2,4}', 'hi,my name is xiaoming')) # ['hi,m', 'name', 'is', 'xiao', 'ming']
贪婪:满足匹配的情况下,尽可能匹配多的数据。 非贪婪:满足匹配的情况下,尽可能匹配少的数据。 默认是贪婪模式。
修改为非贪婪模式:在匹配多个的后面加上问号 ?。
import re
print(re.findall('\S{2,4}', 'hi,my name is xiaoming')) # 贪婪
print(re.findall('\S{2,4}?', 'hi,my name is xiaoming')) # 非贪婪
r = re.match('aaa.+', 'aaa1212bbb')
print(r.group()) # aaa1212bbb (贪婪)
r = re.match('aaa.+?', 'aaa1212bbb')
print(r.group()) # aaa1 (非贪婪)
import re
print(re.findall('^t\w+', 'testabctest')) # ['testabctest']
print(re.findall('^t\w+', 'Testabctest')) # []
import re
print(re.findall('^t\w+t$', 'testabctest')) # ['testabctest']
print(re.findall('^t\w+T$', 'testabctest')) # []
^[ ]: 匹配 [ ] 中列举的字符开头。
[^ ]: 匹配的不是 [ ] 中列举的内容,即取反操作。
import re
print(re.findall('^[Tt]\w+', 'Testabctest')) # ['Testabctest']
print(re.findall('[^Tt]', 'Testabctest')) # ['e', 's', 'a', 'b', 'c', 'e', 's']
import re
r = re.match('<.+>(.*)<.+>', '<h1>python</h1>')
print(r.group()) # <h1>python</h1>
print(r.groups()) # ('python',)
如果 findall 中使用了 (),返回的内容只有 () 中匹配的数据,以列表形式返回。
import re
print(re.findall('<.+>(.*)<.+>', '<h1>python</h1>')) # ['python']
compile(正则表达式) 将正则表达式转换为对象,用于多次调用。
import re
c = re.compile('<.+>(.*)<.+>')
print(c.match('<h1>python</h1>').groups()) # ('python',)
print(c.search('<h1>python</h1>').groups()) # ('python',)
print(c.findall('<h1>python</h1>')) # ['python']
sub(正则表达式,新数据,修改的字符串,替换次数)。
import re
s1 = 'hello 111word 222'
s2 = re.sub('\d{3}', '666', s1)
print(s2) # hello 666word 666
split(正则表达式,要拆分的字符串,拆分的次数)。
import re
s = 'huahua1xiaoming2lisi3lala'
l = re.split('\d', s)
print(l) # ['huahua', 'xiaoming', 'lisi', 'lala']
l = re.split('[1-3]', s)
print(l) # ['huahua', 'xiaoming', 'lisi', 'lala']
\b 匹配单词边界,即前后不能是字母、数字或下划线。
import re
print(re.match('ve\b', 've2test')) # None
print(re.match(r've\b', 've!2test')) # <re.Match object; span=(0, 2), match='ve'>
print(re.match('ve\B', 've2test')) # <re.Match object; span=(0, 2), match='ve'>
print(re.match('ve\B', 've!2test')) # None
注意:\b 在正则里是边界,在字符串里是退格符,所以建议使用 r'' 原始字符串。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online