python-regex模块(正则表达式)

re.png

re模块

在 Python 中,我们可以使用内置的 re 模块来使用正则表达式。

有一点需要特别注意的是,正则表达式使用 \ 对特殊字符进行转义,比如,为了匹配字符串 'python.org',我们需要使用正则表达式 'python\.org',而 Python 的字符串本身也用 \ 转义,所以上面的正则表达式在 Python 中应该写成 'python\\.org',这会很容易陷入 \ 的困扰中,因此,我们建议使用 Python 的原始字符串,只需加一个 r 前缀,上面的正则表达式可以写成:

r'python\.org'


贪婪匹配

在 Python 中,正则匹配默认是贪婪匹配(在少数语言中可能是非贪婪),也就是匹配尽可能多的字符。

比如,我们想找出字符串中的所有 div 块:

import re
content = 'aa
test1
bb
test2
cc' pattern = re.compile(r'
.*
') result = pattern.findall(content) print result

执行结果:

['
test1
bb
test2
']

由于正则匹配是贪婪匹配,也就是尽可能多的匹配,因此,在成功匹配到第一个

时,它还会向右尝试匹配,查看是否还有更长的可以成功匹配的子串。

如果我们想非贪婪匹配,可以加一个 ?,如下:

import re
content = 'aa
test1
bb
test2
cc' pattern = re.compile(r'
.*?
') # 加上 ? result = pattern.findall(content) print result

结果:

['
test1
', '
test2
']


python中的字符串处理

说点题外话,在匹配到字符串后,往往需要进行各种字符串操作,这里给个链接供大家参考,内容很全。


正则表达式表示任意字符

正则表达式可以用.*匹配任意除换行之外的字符。但如果内容中包含任意多个换行怎么匹配?用.*是匹配失败的。但可以用[\s\S]*?。

\s是匹配所有空白字符,\S是匹配所有非空白字符,那么[\s\S]这个组合就可以匹配所有字符了。

关于字符编码的问题

Python3的普通字符串是str类型,实际上就是Python2的unicode类型。
要真正理解清楚这个问题,需要看一看字符编码的知识,理解unicode编码方式和实现方式的关系。
粗略的说,Python3使用的str类型并不关心你最终是什么编码,是gb2312还是utf-8,它只是用unicode的字符集编码来表示每一个字符,直到输出到文件流,需要转换为bytes类型时,才用encode指定具体的编码实现方式。

  • Unicode之痛:深度讲解编码问题

参考资料

  • http://funhacks.net/2016/12/27/regular_expression/
  • http://pycoders-weekly-chinese.readthedocs.io/en/latest/issue5/unipain.html

你可能感兴趣的:(python-regex模块(正则表达式))