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

3

我尝试读取文件中的特定字符串。基本上文件看起来像这样:

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|

我需要的是在字符串 |USA| 中间读取国家名称,起始行为:01/10/2015|14:50:27|USA|UWI_N2C34_2|MMS1|FORD35|Bednarek|true|6|0|false|
为了实现这个目标,我尝试使用正则表达式中的 group 函数。我推断出需要从包含该字符串的特定行开始读取。因此,我编写了以下简短代码:
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
就翻译而言,我的做法是:我会亲自逐行阅读文件,直到找到[META DATA]为止,并找到其后的一行。然后,我会用ls=line.split('|')将其分割,并使用country=ls[2]提取其中的第三个元素。 - Pynchia
非常好的解决方案,谢谢 :) - Wiktor
3个回答

0

你的正则表达式有问题,试试这个

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

是的,这正是我所缺少的 :) - Wiktor

0
在正则表达式中,字符|用于分隔不同的选择项。因此,如果你定义了一个类似这样的正则表达式,
(\d+)/(\d+)/(\d+)|(\d+):(\d+):(\d+)

它将匹配形式为数字/数字/数字 或者 形式为数字:数字:数字的字符串。但不会同时匹配两种形式。

因此,当您使用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
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|

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接