2015-10-20 66 views
3

我嘗試讀取文件中的特定字符串。基本上,文件看起來像這樣:Python - 查找文件中的特定字符串

S0M6A36A108A180A252A324A36|1|48|89|36|Single| 
S0M6A36A108A180A252A324A36|2|43|83|108|Single| 
S0M6A36A108A180A252A324A36|3|37|85|180|Single| 
S0M6A36A108A180A252A324A36|4|37|93|252|Single| 
S0M6A36A108A180A252A324A36|5|43|95|324|Single| 
S0M6A36A108A180A252A324A36|6|42|89|36|Single| 

[META DATA] 
01/10/2015|14:50:27|USA|UWI_N2C34_2|MMS1|FORD35|Bednarek|true|6|0|false| 

[QUALITY CAMERA CHECK] 
1|1|0| 
2|1|0| 
3|1|0| 
4|1|0| 
5|1|0| 
6|1|0| 

[PRESET] 
S0M6A36A108A180A252A324A36|TA| 

我需要的是從行改爲:01/10/2015|14:50:27|USA|UWI_N2C34_2|MMS1|FORD35|Bednarek|true|6|0|false| 串之間的國名|USA|

要做到這一點我試圖使用功能組是正則表達式的一部分。我推斷我需要從包含這個字符串的特定行讀取。所以我寫了小碼:

import os 
import string 
import re 
import sys 
import glob 
import fileinput 

country_pattern = 'MYS','IDN','ZAF', 'THA','TWN','SGP', 'NWZ', 'AUS','ALB','AUT','BEL', 'BGR', 'BIH', 'CHE','CZE', 'DEU', 'DNK', 'ESP','EST','SRB','MDK','MNE','BIH', 'BIH','MNE','FIN', 'FRA', 'GBR','GRC', 'HRV', 'HUN', 'IRL', 'ITA', 'LIE', 'LTU', 'LUX', 'LVA', 'MDA', 'SMR','CYP','NLD','NOR','POL','PRT','ROU','SCG', 'SVK','SVN','SWE','TUR','BRA','CAN','USA','MEX','CHL','ARG','RUS' 
pattern = r'(\d+)/(\d+)/(\d+)|(\d+):(\d+):(\d+)|(\S+)|(\S+)|(\S+)|(\S+)|(\S+)|(\S+)|(\d+)|(\d+)|(\S+)|' 

src = raw_input("Enter source disk location: ") 
src = os.path.dirname(src) 
for dir,_,_ in os.walk(src): 
    file_path = glob.glob(os.path.join(dir,"*.txt")) 
    for file in file_path: 
    f = open(file, 'r') 
    object_name = f.readlines() 
    f.close() 

    for line_name_tmp in object_name: 
     line_name = line_name_tmp.replace('\n','') 
     if line_name == '': 
      line_name.split() 
      continue 
     else: 
      try: 
       searchObj = re.search(pattern, line_name) 
       m = searchObj.group(7) 
       if m in country_pattern: 
        print "searchObj.group(7) : ", searchObj.group(7) 
       else: 
        print 'did not find any match' 
      except: 
       print line_name 
       pass 

但它總是會打印出'沒有找到任何匹配'。我錯過了什麼 ? 感謝您的建議。

+3

個人而言,我會讀每行的文件中,直到我發現'[元數據]',那麼下面一行。然後我將它分開'ls = line.split('|')',並將其第三個元素與'country = ls [2]' – Pynchia

+0

偉大的解決方案,謝謝:) –

回答

0

你再是問題 試試這個

pattern = r'(\d+)/(\d+)/(\d+)\|(\d+):(\d+):(\d+)\|(\S+)\|(\S+)\|(\S+)\|(\S+)\|(\S+)\|(\S+)\|(\d+)\|(\d+)\|(\S+)\|' 
+0

是的,這是正是我想念:) –

0

在正則表達式中,字符|分隔替代方案。所以,如果你像這樣定義一個正則表達式,

(\d+)/(\d+)/(\d+)|(\d+):(\d+):(\d+) 

它將匹配形式digits/digits/digits形式digits:digits:digits的一串一串的。不是都。

因此,當你把你的pattern正則表達式和搜索行

01/10/2015|14:50:27|USA|UWI_N2C34_2|MMS1|FORD35|Bednarek|true|6|0|false| 

進行匹配,正則表達式捲起只有部分01/10/2015匹配,因爲這部分是由第一種選擇((\d+)/(\d+)/(\d+))相匹配。正則表達式中的第七個捕獲組不在匹配的部分,所以m.group(7)返回None,當然None不是country_pattern中的元素之一。

簡單 - 或者可以說懶 - 解決這個問題的方法是在正則表達式的定義中轉義管道字符:使用\|而不是|。但是由於您的文件中有|字段,因此如果您要使用line_name.split('|')並選擇第三個字段,而不是使用正則表達式,則可能會有更好的設計程序。

+0

謝謝,它的工作:) –

0
if need just to find it text country abbreviation this will do it: 

data = ''' 
01/10/2015|14:50:27|USA|UWI_N2C34_2|MMS1|FORD35|Bednarek|true|6|0|false| 
''' 
country_pattern = 'MYS','IDN','ZAF', 'THA','TWN','SGP', 'NWZ', 'AUS','ALB','AUT','BEL', 'BGR', 'BIH', 'CHE','CZE', 'DEU', 'DNK', 'ESP','EST','SRB','MDK','MNE','BIH', 'BIH','MNE','FIN', 'FRA', 'GBR','GRC', 'HRV', 'HUN', 'IRL', 'ITA', 'LIE', 'LTU', 'LUX', 'LVA', 'MDA', 'SMR','CYP','NLD','NOR','POL','PRT','ROU','SCG', 'SVK','SVN','SWE','TUR','BRA','CAN','USA','MEX','CHL','ARG','RUS' 

mo = re.search(r'\|[A-Z]{3}\|',data) 
if mo: 
    print(mo.group(0)) 


|USA| 
+0

也有趣的解決方案謝謝:) –