您的位置:首页 > 编程语言 > Python开发

python学习笔记(五)文件操作、正则表达式

2017-04-20 22:45 776 查看

文件操作

python的文件IO操作和C++类似,都是流的形式。

fin = open('code.txt','r')
fout = open('output.txt','w')


在c++中,每次打开文件后都需要判断打开是否成功,否则一旦读取出错程序就会终止,此外,读写操作完之后还需要调用close关闭文件。在python中也不例外,但是有比较方便的with语句来帮助完成这些操作:

with open('code.txt')as fin:
print fin.read()


在python中读写文件都是一次性的(至少在语句上是这样),如上read()语句将直接读出code中的所有内容。

with open('output.txt')as fout:
fout.write(data)


读文件时有时会遇到编码的问题,python使用的是unicode编码。通常对读出的内容使用decode(类型)来转换。

此外还有更简洁的方式,使用codecs库:

import codecs
with codecs.open('code.txt','r','gbk')as fin:
fin.read()


正则表达式

正则表达式是专用于操作字符串的工具。关于正则表达式需要不断使用、查书、使用才能学会。

这里用之前的NC代码编译器作为例子,来探索python中的正则表达式使用方法。

模式

模式表达了需要的字符串的。

模式表达方法:

pattern_str = r'^N(\d+)(\s+([GNXYZMTSF])[+-]?(\d+))+;'


在模式中,()括起来的内容属于一组,每当匹配一个,组就增加一个。

匹配

匹配一个字符串,有两种方式,一是使用re模块中提供的方法进行匹配,二是建立一个模式对象,使用其方法进行匹配。

m1 = re.match(r'^N(\d+)(\s+([GNXYZMTSF])[+-]?(\d+))+;',str)
pattern2 = re.compile(r'^N(\d+)(\s+([GNXYZMTSF])[+-]?(\d+))+;')
m2 = pattern2.match(str)
m3 = pattern2.search(str)
m4 = pattern2.findall(str)


第一种方法适合只匹配一次的情况,pattern2适合于需要不断使用该模式的情况,使用match是对字符串从第一个字符开始匹配,使用search是在字符串中查询符合模式的子串(都只匹配一次);使用findall是匹配所有符合模式的子串(匹配多次)。

查看结果

使用match()或者search()方法匹配成功,m非None,可以对其匹配结果进行查看,group为其匹配的第一个符合的串,groups为其所有匹配的组。

if(m):
print m.group()
print m.groups()


使用findall()得到的m是一个列表,其中每一项是一个元组,包含匹配的每一组的字符串。

切分

re中提供的split方法可以按照一个模式将字符串切分成多个字符串,使用方法见下面的例子。

一个例子

import re
def NC(str):
pattern = re.compile(r'^N(\d+)(\s+([GNXYZMTSF])[+-]?(\d+))+;')
strs = re.split(r'\n',str)
for s in strs:
m = pattern.match(s)
if(m):
print m.groups()

with codecs.open('code.txt','r')as f:
NC(f.read())


这里的结果并不如预期的匹配所有数字以及地址符,字符串匹配成功,但组只有四组,只得到了最后一组的内容。说明这种组的方法所匹配的组数是固定的(括号对的个数)。

参考资料:

廖雪峰教程:

http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832260566c26442c671fa489ebc6fe85badda25cd000

python正则表达式:

http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 正则表达式