2013-07-09 92 views
2

我想將.txt文件的內容作爲字符串加載並提取特定的信息。該信息,其中有很多之前和它的occurence後的文字,看起來像這樣:Python從文本文件中提取不同長度的值

ValueName:  1234 

但也可能是這樣的:

ValueName:  123456 

也就是說,該值始終是一串整數,但長度各不相同。

我想在字符串中找到'ValueName',然後返回6個字符後面的字符。我的想法是說檢查並查看'ValueName'後面6個字符開始的10個字符是否是整數,如果是,則返回它們。這可能嗎?謝謝。

+0

整個文件是由鍵值對組成的,就像你用作例子的那樣?如果是這種情況,您可能需要考慮將文件讀入字典中,然後您可以根據密鑰輕鬆查詢值,而不考慮其長度。如果不是文件中包含的更廣泛的樣本將是有用的。 – JonathanV

+0

其他文字是否與Valuename:Value對在同一行上,或者它們總是單獨存在? –

回答

3

您可以使用正則表達式來提取值以下ValueName:

>>> import re 
>>> line = 'some dummy text ValueName:  123456 some dummy text' 
>>> m = re.findall(r'ValueName:\s+([0-9]+)',line) 
>>> m 
['123456'] 

如果存在的話這會找到多個匹配。

>>> import re 
>>> line = 'blah blah ValueName: 1234 blah blah ValueName: 5678' 
>>> m = re.findall(r'ValueName:\s+([0-9]+)',line) 
>>> m 
['1234', '5678'] 
-1

使用正則表達式,你可以做類似

regex = re.compile("^(.*[0-9]{4,}.*)$") 
for line in regex.findall(your_text_here): 
    print line 

由於正則表達式

^(.*[0-9]{4,}.*)$ 

將匹配中間某處至少有4個整數的所有行。

+0

但是沒有提取他在 – Brian

-1

你能做到這一點

import re 

re.findall(r'ValueName:\d\d\d',s) 

如果「S」是你的字符串變量(名稱)和\ d是你要找的整數數量。 在你的情況下,它會是\ d \ d \ d \ d \ d \ d ...不完全漂亮,但它的作品。

+0

之後的信息,這不起作用。嘗試一下他的例子:'re.findall(r'ValueName:\ d \ d \ d','ValueName:123456')'。它不僅不處理空格,而且只讀取前三位數字而不是全部數字,並且它也未能檢查該行的其餘部分是否都是數字。 – abarnert

1
import re 

regex = re.compile(r'ValueName:\s*([0-9]+)') 
with open(file, "r") as f: 
    for line in f: 
     match = re.search(regex, line) 
     if match: 
      result = int(match.group(1)) 
      break 
+0

爲什麼不直接使用'finditer'或'findall'而不是顯式循環'match'? – abarnert

+0

好吧,你仍然需要檢查findall的返回值是否爲空列表。除非你的意思是爲整個文件找到所有的文件,在我看來這是不理想的,因爲一旦你找到了你尋找的字符串,你就可以制動(這是我從OP的規範中瞭解到的) – vfiskewl

1

使用正則表達式

import re 
for line in text 
    re.search('^ValueName: (\d+)',line).group(1) 

如果你需要將它們進行排序,然後你應該把它們名單上。

lst.append(re.search('^ValueName: (\d+)',line).group(1)) 

最後只是排序列表

排序(LST)

接下來,我告訴你一個完整的例子,所以你可以提取你所需要的

import re 

text = ['ValueName: 33413','ValueName: 443234531','ValueName: 5243222','ValueName: 33'] 
lst = [] 

for line in text: 
    lst.append(re.search('^ValueName: (\d+)',line).group(1)) 

lst = [int(x) for x in lst] 
for x in sorted(lst): 
    print(x) 
+0

這不適用於OP的示例輸入。 – abarnert

3

正則表達式將使這比較簡單,正如Brian的回答(其中包括)所示。

但是如果你不願意理解它的作用,不要使用正則表達式。如果您現在要推遲學習曲線,*這是不是很難用簡單的字符串處理做:

def numeric_value_names(path): 
    with open(path) as f: 
     for line in f: 
      bits = line.partition('ValueName:') 
      if bits[1] and not bits[0]: 
       rest = bits[2][6:].rstrip() 
       if rest.isdigit(): 
        yield rest 

使用str.partition這種方式可能有點鈍到新手,所以你可能想使病情更加明顯:

def numeric_value_names(path): 
    with open(path) as f: 
     for line in f: 
      if line.startswith('ValueName:'): 
       bits = line.partition('ValueName:') 
       rest = bits[2][6:].rstrip() 
       if rest.isdigit(): 
        yield rest 

*您肯定想了解在某個點簡單的正則表達式;唯一的問題是你是否有更緊迫的事情要做...

+0

+1這可能是OP開始的方式 – Brian

+0

@Brian:另一方面,現在和學習正則表達式一樣好,而且你的答案顯示了正則表達式對於這樣的問題是多麼簡單。 「 – abarnert

+0

+1」但如果你不願意理解它的作用,請不要使用正則表達式。「我希望我能+2爲「*你肯定想在某些時候學習簡單的正則表達式;」。 – 2rs2ts

相關問題