2011-08-08 235 views
1

我有一段代碼可以提取位於兩個字符串之間的字符串。但是,此腳本只在一行上執行此操作。我想要在完整文件上執行此操作並獲取所有在這兩個詞之間的詞彙。Python中的文件操作

注:這兩個詞fixed.For例如:如果我的代碼是一樣的東西

'const int variablename=1' 

然後我想的'int''='之間躺在文件中的所有單詞的列表。 這是當前腳本:

s='const int variablename = 1' 

k=s[s.find('int')+4:s.find('=')] 

print k 
+0

「int」和「=」之間允許的是什麼? –

回答

2
with open(filename) as fn: 
    for row in fn: 
     # do something with the row? 
3

如果文件舒適,適合到內存中,你可以用一個正則表達式調用得到這樣的:

import re 
regex = re.compile(
r"""(?x) 
(?<= # Assert that the text before the current location is: 
\b  # word boundary 
int # "int" 
\s  # whitespace 
)  # End of lookbehind 
[^=]* # Match any number of characters except = 
(?<!\s) # Assert that the previous character isn't whitespace. 
(?=  # Assert that the following text is: 
\s* # optional whitespace 
=  # "=" 
)  # end of lookahead""") 
with open(filename) as fn: 
    text = fn.read() 
    matches = regex.findall(text) 

如果二者之間可以只有一個字int=,那麼正則表達式更簡單一點:

regex = re.compile(
r"""(?x) 
(?<= # Assert that the text before the current location is: 
\b  # word boundary 
int # "int" 
\s  # whitespace 
)  # End of lookbehind 
[^=\s]* # Match any number of characters except = or space 
(?=  # Assert that the following text is: 
\s* # optional whitespace 
=  # "=" 
)  # end of lookahead""") 
+0

'[^ =] *#匹配任意數量的字符,除了='也會匹配空格。它應該是'[^ =] *'(或'\ s')。 – jsz

+0

不知道這是個好主意 - 誰知道空間是否也可以成爲預期匹配的一部分? –

+0

那麼,這只是與以下'(?=)'不一致。你在'[^]'中有什麼應該匹配下面的loodahead'(?=)'。如果預期的匹配可能包含空格,爲什麼還要在前瞻中包含'\ s'? – jsz

0

如果你想要一個快速和骯髒的方法,你在一個類Unix系統。

我只是應該在文件上使用grep。 然後,我將分割字符串以識別模式和我想要的數據。

1

我會在整個文本上使用正則表達式(你也可以在一行上完成)。這會在「int」和「=」之間打印字符串

import re 

text = open('example.txt').read() 
print re.findall('(?<=int\s).*?(?=\=)', text) 
+0

感謝您的工作。這服務我的目的:) – neon