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'] 
相關問題