簡體   English   中英

Python - 在文件中查找特定字符串

[英]Python - finding specific string in files

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

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

但它總會打印出來'沒找到任何匹配'。 我錯過了什么 ? 謝謝你的建議。

在正則表達式中,字符| 分開替代品。 所以,如果你定義這樣的正則表達式,

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

它將匹配形式digits/digits/digits的字符串形式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中的元素之一。

容易 - 或者可能會說懶惰 - 修復這個問題的方法是在正則表達式的定義中轉義管道字符:use \\| 而不是| 但是因為你有以|分隔的字段 在文件中,如果您使用line_name.split('|')然后選擇第三個字段而不是使用正則表達式,我認為您可能有更好的設計程序。

你的問題是嘗試這個問題

pattern = r'(\d+)/(\d+)/(\d+)\|(\d+):(\d+):(\d+)\|(\S+)\|(\S+)\|(\S+)\|(\S+)\|(\S+)\|(\S+)\|(\d+)\|(\d+)\|(\S+)\|'
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|

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM