2014-02-28 34 views
0

我是新來的這個論壇,如果我違反了任何論壇規則,請提前編程並道歉。我對此進行了廣泛的研究,但是我找不到解決方案。在Python中使用正則表達式查找和複製一條線

所以我有了這個總體結構很長的文件:

data=""" 
    20.020001 563410 9 
    20.520001 577410 20 
    21.022001 591466 9 
    21.522001 605466 120 
    23.196001 652338 2 
    25.278001 710634 7 
    25.780001 724690 144 
    26.280001 738690 9 
    26.782001 752746 40 
    27.282001 766746 9 
    27.784001 780802 140 
    29.372001 825266 2 
    31.458001 883674 7 
    31.958002 897674 8 
    32.458002 911674 9 
    32.958002 925674 10 

""" 

我進口使用

with open("C:\blablabla\text.txt", 'r+') as infile: 
data = infile.read() 

現在我試圖用一個正則表達式查找所有行的文件用140至146結束了,所以我這樣做:

items=re.findall('.......................14[0-6]\n',data,re.MULTILINE) 
for x in items: 
    print x 

這個工作,但是當我現在嘗試ŧ O複製那些包含正則表達式的線條,

for x in items: 
    if items in data: 
     data.write(items) 

我得到以下錯誤:

if items in data: 
TypeError: 'in <string>' requires string as left operand, not list 

我的理解是什麼問題,但我不知道如何解決它。當我的正則表達式的結果是一個列表時,如何給左操作數提供一個字符串?

任何幫助非常感謝!

+0

對於空格分隔的文本塊的固定格式,它通常是一個很好的解決方案,可以選擇''分割'重新'' - 例如'line.split()'會將一行分割成單獨的數字。然後,您可以簡單地檢查最後一項「line.split()[ - 1]」是否在預期的範圍內。 – l4mpi

+0

你爲什麼要檢查'如果數據中的項目:'?你不是剛剛從數據中提取「物品」嗎? –

+0

也檢查'csv'模塊。它可能會使解析更容易 –

回答

0

你應該簡單地分別處理每個行:

data = infile.readlines() 
for line in data: 
    if re.match('.......................14[0-6]\n', line): 
     print line[:-1] 

該行的最後一個字符是結尾的新行,這將通過一個print語句包括被複制。

0

您可以逐行讀取文件中的行:

data="" 
with open("file.txt", 'r+') as infile: 
    for line in infile: 
     if (146 >= int(line.split()[-1]) >= 140) : 
      data = data + line 

print data 
0

您正則表達式可以簡化進一步

re.findall('.*?14[0-6]\n') 

克服你的其他問題

items = re.findall('.*?14[0-6]\n',data) 
result="""""" 
for x in items: 
    result+=str(x) 
print result