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

2018-03-25  本文已影响0人  stanf1l
re.png

re模块

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

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

r'python\.org'

贪婪匹配

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

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

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

执行结果:

['<div>test1</div>bb<div>test2</div>']

由于正则匹配是贪婪匹配,也就是尽可能多的匹配,因此,在成功匹配到第一个</div> 时,它还会向右尝试匹配,查看是否还有更长的可以成功匹配的子串。

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

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

结果:

['<div>test1</div>', '<div>test2</div>']

python中的字符串处理

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


正则表达式表示任意字符

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

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

关于字符编码的问题

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

参考资料

上一篇 下一篇

猜你喜欢

热点阅读