Python查找子字符串

时间:2012-03-10 20:52:09

标签: python split

我有一项非常特殊的工作要做,这是我的输入

Period End Date         12/30/    12/31/   12/29/    12/28/    12/31/2007
                         2011      2010     2009      2008

您可以看到这是一个错误的输入文件:

  1. 年就在第二行
  2. 但最后日期是正确的
  3. 所以我想挖出正确的日期: 12/31/2011 12/31/2012 12/31/2009 12/31/2008 12/31/2007

    这是我想要做的事情

     input_file = open("input", "r")
     for line in input_file:
       index = line.find("Period End Date", 0)
       if index != -1:
         line = line[index+len("Period End Date"):len(line)] 
         temp_line = " ".join(line.split())
         temp_line.split(" ")
    
         year_line= input_file.next()
         #remove space, split,append on temp_line[i]
    

    但它不起作用:

    temp_line.split(" ")
    

    返回['1','2','/', ...]而不是['12/31/', '12/30', ...]

    这有什么不对?

3 个答案:

答案 0 :(得分:2)

让我们来看看你的代码:

temp_line = " ".join(line.split())

用一个空格替换多个空格。到目前为止,好吧。下一行:

temp_line.split(" ")

现在怎样?在单一空间再次拆分?这只会逆转您之前所做的联接。你为什么不坚持使用line.split()呢?此外,您没有将结果分配回temp_line,因此结果是丢弃,这可能是此处的主要问题。

你可以使用类似的东西:

 with open("input", "rb") as f:
   lines = list(f)
   for date_line, year_line in zip(lines, lines[1:])[::2]:
     parts = date_line.strip().split()
     if ' '.join(parts[0:3]) != 'Period End Date': continue

     dates, years = parts[3:], year_line.strip().split()[1:]
     year_index = 0
     for date in dates:
       if not date.split('/')[-1]:
         date = date + years[year_index]
         year_index += 1
       print date

答案 1 :(得分:1)

我将假设日期的数量有所不同,但总是包含N个日期月份条目,然后是完整的日 - 月 - 年份条目,其次是N年条目:

def getHeadings(s):
    head = s.split()
    num_dates = (len(head) - 4)/2
    return [dm+y for dm,y in zip(head[3:3+num_dates], head[4+num_dates:])] + head[3+num_dates:4+num_dates]

getHeadings("""    Period End Date 12/30/ 12/31/ 12/29/ 12/28/ 12/31/2007

                        2011      2010     2009      2008""")

返回

['12/30/2011', '12/31/2010', '12/29/2009', '12/28/2008', '12/31/2007']

答案 2 :(得分:0)

它有效

>>> temp_line = " ".join(line.split())
>>> temp_line
'12/30/ 12/31/ 12/29/ 12/28/ 12/31/2007'
>>> temp_line.split(" ")
['12/30/', '12/31/', '12/29/', '12/28/', '12/31/2007']

如果您正在迭代temp_line中的每个项目,那么您将获得'1','2','/'等等。

另外,我可以建议您对代码进行一些pythonic调整吗?使用line.split('Period End Date ')[1].strip().split(" ")代替

line = line[index+len("Period End Date"):len(line)] 
temp_line = " ".join(line.split())
temp_line.split(" ")

Plus file是python中的迭代器,你可以简单地做 -

with open(...) as f:
    for line in f:
        <do something with line>

with语句处理打开和关闭文件,包括是否在内部块中引发异常。 for line in f将文件对象f视为可迭代,它自动使用缓冲的IO