感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
| 参数 | 说明 |
| :-- | :-- |
| pattern | 匹配的正则表达式 |
| string | 待匹配的字符串 |
| flags | 标志位,用于控制正则表达式的匹配方式 |
在字符串中找到正则表达式所匹配的所有子符串,返回一个列表,包含匹配到的所有字符串。
若匹配的正则表达式中含分组,则只会返回分组内容。
如果没有找到匹配的,则返回空列表。
示例:
s = ‘Python1,Python2,Python3’
re.findall(r’\d’,s)
[‘1’, ‘2’, ‘3’] # 返回匹配到的所有字符串
re.findall(‘a’,s)
[] # 无匹配项,返回空列表
注意: match 和 search 是匹配一次,而 findall 匹配所有。
re.finditer 查找所有并返回迭代器
和 re.findall 类似,在字符串中找到正则表达式所匹配的所有字符串,并把它们作为一个迭代器返回。
函数语法:
re.finditer(pattern, string, flags=0)
re.finditer 返回的是 迭代器,包含匹配的 re.Match 对象 而不是字符串。
re.finditer(r’\d’,s)
<callable_iterator object at 0x01C91898>
r = re.finditer(r’\d’,s)
r
<callable_iterator object at 0x01C918C8>
for t in r:
print(t)
print(t.group)
<re.Match object; span=(6, 7), match=‘1’>
<built-in method group of re.Match object at 0x01CABA68>
<re.Match object; span=(14, 15), match=‘2’>
<built-in method group of re.Match object at 0x01C763A0>
<re.Match object; span=(22, 23), match=‘3’>
<built-in method group of re.Match object at 0x01CABA68>
re.compile 生成表达式对象
re.compile 函数用于编译正则表达式,生成一个正则表达式(re.Regex)对象,供 match 和 search 等函数使用。
re.Regex 对象:文末解释,点击跳转,或点击上方蓝色超链接跳转。
函数语法:
re.compile(pattern[, flags])
参数说明:
| 参数 | 说明 |
| :-- | :-- |
| pattern | 字符串形式的正则表达式 |
| flags | 标志位,用于控制正则表达式的匹配方式 |
示例:
p = re.compile(r’\d’)
s = ‘Python1,Python2,Python3’
p.match(s,pos=0,endpos=20) # 从第一个开始匹配,不匹配,返回 None
None
pos 为开始匹配的位置,默认为 0,
endpos 为结束匹配的位置,默认为字符串总长
这两个参数只有在 re.Regex 对象的方法才有,即用 re.compile 生成的对象
p.match(s,6,20) # 从第六个开始匹配,匹配成功,返回 re.Match 对象
<re.Match object; span=(6, 7), match=‘1’>
p.search(s,0,10)
<re.Match object; span=(6, 7), match=‘1’>
p.findall(s,0,30)
[‘1’, ‘2’, ‘3’]
p.finditer(s,0,30)
<callable_iterator object at 0x01C14610>
p.sub(‘5’,s)
‘Python5,Python5,Python5’
p.split(s)
[‘Python’, ‘,Python’, ‘,Python’, ‘’]
re.Match 对象
对象方法:
| re.Match 匹配对象方法 | 说明 |
| :-- | :-- |
| group(group=0) | 1. 返回匹配到的字符串。
2. 若指定 group,则返回指定的分组 |
| groups() | 返回一个元组,包含所有分组 |
| start(group=0)
end(group=0) | 1. 返回匹配到的字符串的起始或结束位置。
2. 若指定 group,则返回指定的分组的起始或结束位置 |
| span(group=0) | 1. 返回一个二项元组,包含匹配到的字符串开始、结束的位置
相当于 (start(group),end(group))
2. 若指定 group,则返回指定分组的位置 |
示例:
s = ‘David 612 - Python’
r = re.search(r’(\d+).*§',s)
r
<re.Match object; span=(6, 13), match=‘612 - P’> # 返回 re.Match 对象
r.group() # 获取匹配到的字符串
‘612 - P’
r.group(1) # 获取第一个分组
‘612’
r.groups() # 获取所有分组
(‘612’, ‘P’)
r.start() # 获取字符串开始位置
6
r.start(1) # 获取第一个分组开始位置
6
r.end() # 获取字符串结束位置
13
r.end(1) # 获取第一个分组结束位置
9
获取字符串位置
r.span()
(6, 13)
(r.start(),r.end())
(6, 13)
获取第二个分组的位置
r.span(2)
(12, 13)
(r.start(2),r.end(2))
(12, 13)
re.Regex 对象
re.compile 生成的对象,供 match 和 search 等函数使用。
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。
修饰符被指定为一个可选的标志。
多个标志可以通过按位 OR(|) 它们来指定。
如 re.I | re.M 被设置成 I 和 M 标志
| 修饰符 | 说明 |
| :-- | :-- |
| re.I | 使匹配对大小写不敏感 |
| re.L | 做本地化识别(locale-aware)匹配 |
| re.M | 多行匹配,影响 ^ 和 $ |
| re.S | 使 “ . “ 匹配包括换行在内的所有字符 |
| re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
| re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
示例:
s = ‘’’
DaViD 612
PyThOn
‘’’
re.search(r’python’,s,flags=re.I)
<re.Match object; span=(11, 17), match=‘PyThOn’>
re.search(r’david \d+.python’,s,flags=re.I | re.S)
<re.Match object; span=(1, 17), match=‘DaViD 612\nPyThOn’>
模式字符串使用特殊的语法来表示一个正则表达式。
字母和数字表示他们自身;多数字母和数字前加一个反斜杠时会拥有不同的含义。
一些标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
反斜杠本身需要使用反斜杠转义。
如果使用模式同时提供了可选的标志参数,某些模式元素的含义会改变。
基本
| 模式 | 说明 |
| :-- | :-- |
| ^ | 匹配字符串的开头 |
| $ | 匹配字符串的末尾 |
| . | 匹配除换行符外任意字符
当 re.DOTALL 标记被指定时,则可匹配包括换行符的任意字符。 |
| …* | 匹配 0 个或多个的表达式 |
| …+ | 匹配 1 个或多个的表达式 |
| …? | 匹配 0 个或 1 个由前面的正则表达式定义的片段
非贪婪方式 |
| a|b | 匹配 a 或 b |
| *?、+?、?? | 匹配 re、re+、re? 的尽量少个*
非贪婪方式 |
| […] | 匹配 [] 中的任意一个字符
如 [amk] 匹配 ‘a’,‘m’或’k’ |
| [^…] | 匹配不在 [] 中的字符
如:[^abc] 匹配除了 a, b, c 之外的字符。 |
| …{n} | 匹配 n 个前面表达式
如,o{2} 不能匹配 Bob 中的 o,但是能匹配 food 中的两个 o。 |
| …{n,} | 匹配 n 个及以上前面表达式
如,o{2,} 不能匹配 Bob 中的 o,但能匹配 foooood 中的所有 o。
o{1,} 等价于 o+。o{0,} 则等价于 o*。 |
| …{n, m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
| (?>…) | 匹配的独立模式,省去回溯 |
| (?#…) | 注释 |
组
| 模式 | 说明 |
| :-- | :-- |
| (…) | 匹配括号内的表达式,也表示一个组 |
| (?P…) | 命名的组 |
| (?P=name) | 调用已命名的组 |
| \1…\9 | 调用第 n 个分组的内容。 |
| \10 | 匹配第 n 个分组的内容
如果它经匹配。否则指的是八进制字符码的表达式。 |
| (?imx: …) | 在括号中使用i, m, 或 x 可选标志
只影响括号中的区域 |
| (?-imx: …) | 在括号中不使用i, m, 或 x 可选标志
只影响括号中的区域 |
| (?: …) | 类似 (…),但是不表示一个组 |
界定符
| 模式 | 说明 |
| :-- | :-- |
| (?<=…) | 前向肯定界定符
如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。
但一旦所含表达式已经尝试,匹配引擎根本没有提高;
模式的剩余部分还要尝试界定符的右边。 |
| (?<!..) | 前向否定界定符
与肯定界定符相反,当所含表达式不能在字符串当前位置匹配时成功。 |
| (?=…) | 后向肯定界定符 |
| (?!..) | 后向否定界定符 |
转义字符
| 模式 | 说明 |
| :-- | :-- |
| \w | 匹配数字字母下划线
等价于 [A-Za-z0-9_] |
| \W | 匹配非数字字母下划线
等价于 [^A-Za-z0-9_] |
| \s | 匹配任意空白字符
等价于 [ \t\n\r\f\v] |
| \S | 匹配任意非空字符
等价于 [^ \t\n\r\f\v] |
| \d | 匹配任意数字
等价于 [0-9] |
| \D | 匹配任意非数字
等价于 [^0-9] |
| \A | 匹配字符串开始 |
| \z | 匹配字符串结束 |
| \Z | 匹配字符串结束
如果是存在换行,只匹配到换行前的结束字符串。 |
| \G | 匹配最后匹配完成的位置 |
| \b | 匹配一个单词边界,也就是指单词和空格间的位置。
如, er\b 可以匹配 never 中的 er,但不能匹配 verb 中的 er。 |
| \B | 匹配非单词边界
如,er\B 能匹配 verb 中的 er,但不能匹配 never 中的 er。 |
| \n | 匹配一个换行符 |
| \t | **匹配一个制表符 |
匹配 Markdown:
‘# (.+)’ # 一级标题
‘## (.+)’ # 二级标题
‘### (.+)’ # 三级标题
‘#{4} (.+)’ # 四级标题
‘#{5} (.+)’ # 五级标题
‘#{6} (.+)’ # 六级标题
‘> (.+)’ # 引用
‘(`)(.+)\1’ # 行内代码
‘([*_])(.+)\1’ # 斜体
‘([*_]{2})(.+)\1’ # 粗体
‘([*_]{3})(.+)\1’ # 斜粗体
回到标题提出的问题:如何用正则表达式匹配女朋友?
来看看这个例子:
peoples = ‘People1People2MyGirlfriendPeople3People4’
开始匹配:
mygirlfriend = re.search(‘MyGirlfriend’, peoples)
查看结果:
mygirlfriends.group()
MyGirlfriend
成功!
赶快去匹配一个女朋友吧!
什么?你没有女朋友?点击查看追女生秘籍:https://blog.csdn.net/weixin_48448842/article/details/119630331
以及炫酷的播放器:
如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
四、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!