2017-09-13 89 views
1

我有一些文本文件,我想在哪一行找到float +'\ t'+ float存在的模式。在文本文件中找到一個模式(float +' t'+ float)

文本文件看起來是這樣的:數據1之前

some information: bla bla 
test time: 1.34 
something else 23.00 
data1 data2 
0.01 0.22 
0.2 0.34 
..... 

的文字信息可以在行和數據1和數據2也可變化不同而不同。

我會喜歡熊貓的解決方案,但其他一切都可以接受。

回答

1
^.*\d*\.\d+\t\d*\.\d+.*$ 

這將幫助你識別包含floatTABfloat值

Regex Demo

樣品來源(run it here)行:

import re 
regex = r"^.*\d*\.\d+\t\d*\.\d+.*$" 
matches = re.finditer(regex, test_str, re.MULTILINE) 
for match in matches: 
    print(match.group(0)) 
+0

謝謝。只需要做一些「枚舉」,以獲得行號。 – AldinDelic

+0

@AldinDelic就答案而言,這不是一個好主意。總是儘量避免迭代行。這是非常緩慢的,並且會打亂大數據。 –

+0

@AldinDelic,很高興知道我的答案幫助您找到了您需要的解決方案。如果需要蘋果,那麼儘管它可能會嚐到更好的味道,但不能消費。 –

0

您首先需要一種方法來查找浮動。 假設他們總是被寫入點作爲分隔符,下面會做什麼:

\d+(\.\d+)? 

\d+   Match one or more digits 
    \.\d+  Match a dot followed by one or more digits... 
    ( )? ... maybe 

然後,你需要將兩個浮體之間的匹配空白字符:

\s+ 

全部放在一起:

\d+(\.\d+)?\s+\d+(\.\d+)? 

測試使用Python和re

import re 

regex = re.compile("\d+(\.\d+)?\s+\d+(\.\d+)?") 

print(regex.match("0.2 0.34")) 
print(regex.match("0.01 0.22")) 

輸出:

<_sre.SRE_Match object; span=(0, 8), match='0.2 0.34'> 
<_sre.SRE_Match object; span=(0, 9), match='0.01 0.22'> 

現在,如果你想捕捉的花車:

(\d+(\.\d+)?)\s+(\d+(\.\d+)?) 

你會找到兩個浮點數的羣體13

import re 

regex = re.compile("(\d+(\.\d+)?)\s+(\d+(\.\d+)?)") 

result = regex.match("0.2 0.34") 
print(result.group(1)) 
print(result.group(3)) 

輸出:

0.2 
0.34 
1
df 

         Col1 
0 some information: bla bla 
1   test time: 1.34 
2  something else 23.00 
3    data1 data2 
4     0.01 0.22 
5     0.2 0.34 

df = df.Col1.str.extract('(\d+\.\d+\s\d+\.\d+)', expand=False).to_frame() 
df 
     Col1 
0  NaN 
1  NaN 
2  NaN 
3  NaN 
4 0.01 0.22 
5 0.2 0.34 

要刪除nan行,使用df.dropna

 Col1 
4 0.01 0.22 
5 0.2 0.34 

正則表達式擊穿

(  # open capture group 
\d+  # any number of digits 
\.  # literal dot (escaped) 
\d+  
\s  # any whitespace (sub with \t for a more strict search) 
\d+\.\d+ 
)  # close capture group 
+0

謝謝你的回答。有沒有辦法保持標題(data1和data2)? – AldinDelic

+0

@AldinDelic你的意思是你想分配結果作爲現有的DF的列? –

+0

@AldinDelic如果我理解你是對的,你可以使用'df ['Col2'] = df.Col1.str.extract('(\ d + \。\ d + \ s \ d + \。\ d +)',expand = False )' –

0

你似乎在詢問如何找到含有標籤,不只是空白行線。在這種情況下,你不需要像這樣的東西嗎?

>>> import re 
>>> re.match(r'^(?:[0-9.]+)\\t(?:[0-9.]+)$', r'0.01\t0.22') 
<_sre.SRE_Match object; span=(0, 10), match='0.01\\t0.22'> 

偶然地注意到在t之前存在雙反斜槓。

相關問題