【问题标题】:Extract string between 2 delimiters提取两个分隔符之间的字符串
【发布时间】:2023-05-14 03:05:01
【问题描述】:

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

例子:

文件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”,而不是为其他文件打印“已保存....”。

提前感谢您的帮助

【问题讨论】:

    标签: python string file find


    【解决方案1】:

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

        start = file.find('Bad value') # remove + 9 here, put it later
        end = file.find('SPAN', start)
        if start != -1 and end != -1: # test if key words can be found, -1 for not found:
            return(file[start+9:end])
        else:
            return ""
    

    【讨论】:

    • 感谢天云,效果很好。现在我看到在某些文件中,我要提取的单词出现了好几次。但是使用我的函数它只是提取它找到的第一个并退出。我该如何解决?提前致谢
    【解决方案2】:

    您正在打印一些内容,因为您将 8 添加到 start 变量中。如果未找到字符串,则 Find 返回负数。所以你最终要做的是打印出 [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】:

      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])
      

      【讨论】:

      • 这是答案吗?
      【解决方案4】:

      使用回复:

      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
      

      【讨论】:

        最近更新 更多