在2个分隔符之间提取字符串

时间:2018-04-30 14:32:53

标签: python string file find

我正试图在两个分隔符之间提取一些单词。它适用于脚本找到这些分隔符的文件,但对于其他文件,代码会提取所有文件。

示例:

  

文件00.txt:

'bqukfkb saved qshfqs illjQNqdj iohqsijqsd qsoiqsdqs'
  

档案01.txt:

'jkhjkl dbdqs ihnzqid Bad value okkkk SPAN sfsdf didjsfsdf'

我想打开2个或更多这样的文件,并且只提取以下字词: '坏价值'和'SPAN'。

我的代码适用于文件01.txt,但不适用于00.txt(我认为这是因为它找不到分隔符所以他打印所有内容。我该如何解决?

def get_path(): #return the path of the selected file(s)

    root = Tk()
    i= datetime.datetime.now()
    day = i.day
    month=i.month
    root.filename =  filedialog.askopenfilenames(initialdir = "Z:\SGI\SYNCBBG",title = "Select your files",filetypes = (("Fichier 1","f6365tscf.SCD*"+str(month)+str(day)+".1"),("all files",".*")))
    root.withdraw()
    return (root.filename)

def extraction_error(file): 
    f=open(file,'r')
    file=f.read()
    f.close()
    start = file.find('Bad value') +9
    end = file.find('SPAN', start)
    return(file[start:end])


paths=get_path()
cpt=len(paths)
for x in range(0,cpt):
 print(extraction_error(paths[x]))


Output : saved qshfqs illjQNqdj iohqsijqsd qsoiqsdq
         okkkk 

所以在这种情况下,我只想提取'okkkk'而不是为另一个文件打印'saved ....'。

提前感谢您的帮助

4 个答案:

答案 0 :(得分:0)

在您的extract_error函数中,您可能想测试是否可以找到两个关键字:

$ sudo tcpdump -c 10 -Q in -ne -l -i eth0 icmp and icmp[icmptype]=icmp-echo 2>/dev/null | \
  xargs -L2 sh -c 'echo -n "$9: "; ping -nqc1 $9 | grep rtt' 
192.168.100.132: rtt min/avg/max/mdev = 3.743/3.743/3.743/0.000 ms
192.168.100.132: rtt min/avg/max/mdev = 5.863/5.863/5.863/0.000 ms
192.168.100.132: rtt min/avg/max/mdev = 6.167/6.167/6.167/0.000 ms
192.168.100.132: rtt min/avg/max/mdev = 4.256/4.256/4.256/0.000 ms
192.168.100.132: rtt min/avg/max/mdev = 1.545/1.545/1.545/0.000 ms
$ _

答案 1 :(得分:0)

string.find()如果在字符串中找不到参数,则返回-1,例如:

print "abcd".find("e")  # -1

您可以在返回前检查结果:

start = file.find('Bad value') + 9
end = file.find('SPAN', start)
if start == -1 or end == -1:
    return '' # Or None
return(file[start:end])

答案 2 :(得分:0)

您正在打印一些内容,因为您要在start变量中添加8。如果找不到字符串,则查找返回否定值。所以你最终要做的是从[7:-1]中打印掉元素。我会在print语句之前添加一个if语句:

start = file.find('Bad value')
end = file.find('SPAN', start)
if start != -1 and end != -1:
    print(file[start + 9: end])

答案 3 :(得分:0)

使用re:

import re

def get_text(text):
    pattern= r'.+(Bad value)(.+)(SPAN).+'
    r=re.match(pattern,text)
    if r!=None and len(r.groups()) == 3:
        print(r.groups()[1])


lines = [
'jkhjkl dbdqs ihnzqid Bad value okkkk    SPAN sfsdf didjsfsdf'
,'ghghujh']

for line in lines:
     get_text(line)

输出:

okkkk