python-cookbook学习笔记五

来源:互联网 发布:淘宝的安静一键宏好吗 编辑:程序博客网 时间:2024/06/05 06:33
分割字符串:
如果我们有这样的字符串:字符全部以,为分隔符
line='asdffjdkafed,fjek,asdffoo'
print line.split(',')
我们可以用字符串自带的split功能进行分割,参数携带分割符号就可以了
但是如果字符是这样的形式:
line='asdf fjdk;afed,fjek,asdf, foo'

可以看到字符串的分隔符不固定,有空格 ; , ,+空格多种形式。那么单纯的用一个分隔符号就搞不定了。这个时候正则表达式就派上用场了。我们先看下正则表达式的用法。参考如下的表格




用如下的方式进行分割
print re.split(r'[;,\s]\s*',line)
通过上面的表格可以了解到正则表达式的用法,[]是各种可能出现的符号。然后加上0个或者无限个空格。
即使我们的字符串改成如下的形式,asdf和foo之前有一个,以及多个空格。该方式也能正确的分割出字符
line='asdf fjdk;afed,fjek,asdf,     foo'
 
这里的分割方法只是将字符给分割出来了,如果我们想同时得到分隔符该如何处理呢。这里可以用到分组处理。
print re.split(r'(;|,|\s)\s*',line)
用()分组的方式取代[],然后用|进行分割。通过前面的正则表达式可以了解到这个2个符号的用法。返回的结果如下:可以看到分割符也包含在里面了
['asdf', ' ', 'fjdk', ';', 'afed', ',', 'fjek', ',', 'asdf', ',', 'foo'] 
如果你仍然想使用分组捕获但是不想分割符好出现,可以用(?:....)非捕获分组的形式。如下,这样的效果就和re.split(r'[;,\s]\s*',line)的效果一致
re.split(r'(?:,|;|\s)\s*', line)
具体的正则表达式用法可以参考<正则表达式>这本书,里面介绍得很详细。对于字符串处理来说,正则表达式可以达到事半功倍的效果。值得好好学学

文本处理:
假设你存在一个目录,下面存在各种形式的文件,有txt,csv等等。如果你只想找到其中一种或多种格式的文件并打开该如何办呢。首先肯定是要找到满足条件的文件,然后进行路径合并在一一打开。
path=r'D:\test_source'filenames=os.listdir(path)print filenamesret=[name for name in filenames if name.endswith('.txt')]print retdirect_path=[os.path.join(path,r) for r in ret]print direct_path[0]
运行结果如下:
['1.csv', 'info.txt', 'pycharm2.jpg']
['info.txt']
D:\test_source\info.txt
这个代码中listdir是列出该目录下的所有文件名称。可以看到其中有txt,csv,jpg的文件
[name for name in filenames if name.endswith('.txt')] 这个是找出其中所有txt文件。其中使用到了name.endswith,endswith的功能就是找到所有满足后缀条件的文件。
找到满足的条件后最后用[os.path.join(path,r) for r in ret] 进行路径归并。最后得到完整的满足条件的文件路径。
那么既然有判断结尾的,有没有可以判断开头的呢。Startswith这个就是判断开头的。
[name for name in filenames if name.startswith('1')]
这样就把以1开头的文件找出来了。
 
那么继续发散一下,假如我有如下的文件:假如我只是想以数字开头的txt文件找出来。该如何找呢



这种情况下需要用到正则表达式来进行匹配,但是endswithstartswith中并不能匹配正则表达式。下面介绍一种功能更强大的功能fnmatch.
方法如下:
可以看到fnmatch中我们用到了正则表达式的方法将以数字开头的txt文件给找出来
ret=[name for name in filenames if fnmatch(name,'[0-9].txt')]
再看下面的方法:这个是匹配所有py开头的文件
ret=[name for name in filenames if fnmatch(name,'py*')]
得到的结果如下:
['py_log.txt', 'py_result.jpg']

0 0