美文网首页机器学习程序员大数据 爬虫Python AI Sql
小猪的Python学习之旅 —— 3.正则表达式

小猪的Python学习之旅 —— 3.正则表达式

作者: coder_pig | 来源:发表于2017-12-27 20:14 被阅读174次

re模块

Python中通过re模块使用正则表达式,该模块提供的几个常用方法:

1.匹配

re.match(pattern, string, flags=0)

  • 参数匹配的正则表达式要匹配的字符串标志位(匹配方法)
  • 尝试从字符串的开头进行匹配,匹配成功会返回一个匹配的对象,
    类型是:<class '_sre.SRE_Match'>
    group与groups

re.search(pattern, string, flags=0)

  • 参数:同上
  • 扫描整个字符串,返回第一个匹配的对象,否则返回None

注意match方法和search的最大区别:match如果开头就不和正则表达式匹配,
直接返回None,而search则是匹配整个字符串!!

2.检索与替换

re.findall(pattern, string, flags=0)

  • 参数:同上
  • 遍历字符串,找到正则表达式匹配的所有位置,并以列表的形式返回

re.finditer(pattern, string, flags=0)

  • 参数:同上
  • 遍历字符串,找到正则表达式匹配的所有位置,并以迭代器的形式返回

re.sub(pattern, repl, string, count=0, flags=0)

  • 参数:repl替换为什么字符串,可以是函数,把匹配到的结果做一些转换;
    count替换的最大次数,默认0代表替换所有的匹配。
  • 找到所有匹配的子字符串,并替换为新的内容

re.split(pattern, string, maxsplit=0, flags=0)

  • 参数:maxsplit设置分割的数量,默认0代表所有满足匹配的都分割
  • 在正则表达式匹配的地方进行分割,并返回一个列表

3.编译成Pattern对象

对于会多次用到的正则表达式,我们可以调用re的compile()方法编译成
Pattern对象,调用的时候直接Pattern对象.xxx即可,从而提高运行效率。

附:flags(可选标志位)表

多个标志可通过按位OR(|)进行连接,比如:re.I|re.M

修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

2.正则规则详解


1.加在正则字符串前的'r'

为了告诉编译器这个string是个raw string(原字符串),不要转义反斜杠
比如在raw string里\n是两个字符,''和'n',不是换行!

2.字符

字符 作用
. 匹配任意一个字符(除了\n)
[] 匹配[]中列举的字符
[^...] 匹配不在[]中列举的字符
\d 匹配数字,0到9
\D 匹配非数字
\s 匹配空白,就是空格和tab
\S 匹配非空白
\w 匹配字母数字或下划线字符,a-z,A-Z,0-9,_
\W 匹配非字母数字或下划线字符
- 匹配范围,比如[a-f]

3.数量

字符 作用(前面三个做了优化,速度会更快,尽量优先用前三个)
* 前面的字符出现了0次或无限次,即可有可无
+ 前面的字符出现了1次或无限次,即最少一次
? 前面的字符出现了0次或者1次,要么不出现,要么只出现一次
{m} 前一个字符出现m次
{m,} 前一个字符至少出现m次
{m,n} 前一个字符出现m到n次

4.边界

字符 作用
^ 字符串开头
$ 字符串结尾
\b 单词边界,即单词和空格间的位置,比如'er\b'
可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'
\B 非单词边界,和上面的\b相反
\A 匹配字符串的开始位置
\Z 匹配字符串的结束位置

5.分组

()表示的就是要提取的分组,一般用于提取子串,
比如:^(\d{3})-(\d{3,8})$:从匹配的字符串中提取出区号和本地号码

字符 作用

验证通过后回复 加群 即可获得加群链接(不要把机器人玩坏了!!!)~~~
欢迎各种像我一样的Py初学者,Py大神加入,一起愉快地交流学♂习,van♂转py。


相关文章

网友评论

  • yunhom:a_list = tr.findAll('a') 返回的是2个a标签 其实直接 tr.findAll('a')[0] 就直接拿到第一个了,这样不用再通过再一次的循环判断去排除详情那个a标签了
    coder_pig:嗯,对的,之前是语法不熟悉,懒得改了,能拿到数据就行,哈哈:stuck_out_tongue_closed_eyes:

本文标题:小猪的Python学习之旅 —— 3.正则表达式

本文链接:https://www.haomeiwen.com/subject/hdkpgxtx.html