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指定具体的编码实现方式。
- Unicode之痛:深度讲解编码问题
网友评论