2011-03-03 86 views
0

我有一个非常简单的程序,解析一个csv文件,其中有一行文本记录的列由单个制表符分隔。为什么不line.split(' s')和line.split()一样?

我明白splitting()默认情况下分割空白,所以不需要明确指定空白模式,但我的问题是为什么不明确指定的模式的空白工作?或者'\ s'或r'\ s'不是正确的模式/正则表达式?我在stackoverflow上搜索,发现提到字符串split()是一个较旧的方法,我不明白,因为我是非常新的python。 string split()不支持regex吗?

这里是我的代码:

#!/usr/bin/env python 
import os 
import re 
import sys 

f = open(sys.argv[1]) 
for line in f: 
    field = line.split() 
    field2 = line.split('\s') 
    print field[1], field2[1] 
f.close 

我试图做line.split(R '\ S'),并且也不管用,但line.split( '\ t')的作品。

回答

8

因为\t真正代表字符串中的一个制表符(如\n是换行字符,在这里看到一个list of valid escape sequences),但\s是空格特殊正则表达式字符类

str.split[docs]不接受正则表达式。如果你想用正则表达式分割,你必须使用re.split[docs]

示范:

>>> import re 
>>> str = "This\sis a weird\sstring" 
>>> str.split("\s")     # treated literally 
['This', 'is a weird', 'string'] 
>>> re.split("\s", str)    # regex 
['This\\sis', 'a', 'weird\\sstring'] 
+2

Felix,所以字符串拆分不同于正则表达式拆分?我是python的新手,因此感到困惑。 – 2011-03-03 19:52:21

+0

@软件工程师:是的,正常的'split'字面上对待字符。由于'\ s'不是特殊字符(比如'\ t'),它会尝试将字符串分割为'\ s'。 – 2011-03-03 19:55:06

+2

是的,re.split和str.split是不同的。这两个文件可以在这里找到:http://docs.python.org/library/re.html,http://docs.python.org/library/stdtypes.html – Bernhard 2011-03-03 19:55:47

1

string.split()以一个字符串作为它的参数,并基于该字符串分割。就这样。 \t是一个ASCII制表符,而在这种情况下,\s只是\ + s

对于正则表达式分割,您要导入re并使用re.split()

1

string.split()函数不带正则表达式参数。尝试re.split()

>>> import re 
>>> re.split(r"\s+", "a b") 
['a', 'b'] 
相关问题