Python-在文件中查找特定字符串
我尝试读取文件中的特定字符串。文件基本上如下所示:Python-在文件中查找特定字符串,python,regex,readfile,Python,Regex,Readfile,我尝试读取文件中的特定字符串。文件基本上如下所示: 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|32
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 | U 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
。不是两者都有
因此,当您使用模式
正则表达式并搜索行时
01/10/2015|14:50:27|USA|UWI_N2C34_2|MMS1|FORD35|Bednarek|true|6|0|false|
对于匹配,正则表达式只匹配部分01/10/2015
,因为该部分由第一个备选((\d+/(\d+)/(\d+)/(\d+)
)匹配。正则表达式中的第七个捕获组不在匹配的部分内,因此m.group(7)
返回None
,当然None
不是国家/地区模式中的元素之一
解决这个问题的简单方法(或者可以说是惰性方法)是转义正则表达式定义中的管道字符:使用\\\\\
而不是\
。但是,由于文件中有由
分隔的字段,我认为如果使用line\u name.split(“|”)
然后选择第三个字段,而不是使用正则表达式,您可能会有一个设计更好的程序。您的re就是问题所在
试试这个
pattern = r'(\d+)/(\d+)/(\d+)\|(\d+):(\d+):(\d+)\|(\S+)\|(\S+)\|(\S+)\|(\S+)\|(\S+)\|(\S+)\|(\d+)\|(\d+)\|(\S+)\|'
就我个人而言,我会阅读文件中的每一行,直到找到[元数据]
,然后是下一行。然后我将其拆分为ls=line.split(“|”)
并将其第三个元素与country=ls[2]
非常好的解决方案,谢谢:)是的,这正是我缺少的:)
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|