剥离文本以创建列表并比较 2 个类似的列表



我需要从文件名中拆分文本,如下所示:'foo_bar_1_10.asc.gz',我为每个文件都有一个相应的文本列表,如下所示:'1 10' . 这个相应的列表是我想重新创建的。 原因是我需要将所有文件与主列表进行比较以查找丢失的文件。 所以最终我需要一种方法来比较两个列表(diff? 任何帮助都会很棒

import os
newtxt = []
oldtxt = 'foobarmaster_list.txt'
wd = 'foobar'

for file in os.listdir(wd):
    file = file.split('.')
    subpieces = file[0].split('_')
    numbers = ' '.join(subpieces[-2:])
    newtxt.append(numbers)
    print txt
@@@更新 @@

@我现在有 2 个带有行号的列表(使用类似于 unix 中的 nl 的函数 - 名为 nl 和输出看起来像这样 1: 1 102: 1 12。 我需要检查oldtxt newtxt中的缺失值。 我试过这个:

s = set(nl(newtxt))
diff = [x for x in nl(oldtxt) if x not in s]
print diff

这返回的是一些文本字符,而不是我预期的。 有什么帮助吗?

听起来您正在为字符串解析部分而苦苦挣扎。首先通过调用字符串.split方法将文件名拆分为多个部分,按句点拆分:

>>> file = 'foo_bar_1_10.asc.gz'
>>> pieces = file.split('.')
>>> pieces
['foo_bar_1_10', 'asc', 'gz']

然后根据 _ 字符将其拆分为子部分:

>>> subpieces = pieces[0].split('_')
>>> subpieces
['foo', 'bar', '1', '10']

然后,您可以将最后两个部分重新连接在一起,用空格分隔,如下所示:

>>> numbers = ' '.join(subpieces[-2:])
>>> numbers
'1 10'

一些评论(以及通往解决方案的途径,您会觉得自己想出了很多):

  • 确保你逃脱了foobar ,因为f不会给你你所期望的
  • .replace 方法使用 2 个参数:要替换的内容,要替换的内容。你错过了一个。
  • 如果你知道如何替换foo_bar_,比如说,'',你可以对扩展做同样的事情,并将_替换为,比如说,一个' '......

我想正则表达式会是最简单的。由于您要保留空格,因此将每个非数字字符替换为空格,然后去除前导空格和尾随空格

>>> import re
>>> a = 'foo_bar_1_10.asc.gz'
>>> re.sub('[^d]',' ',a).strip()
'1 10'

假设

s = '1_10.asc.gz'

然后

l = s.split('.')[0].分裂('_')
#Note l = ['1','10']

如果您需要"1 10",则执行

项目 = ' '.join(l)

要执行"差异",请使用集合差异(用法取决于您运行的 python 版本)。看
http://docs.python.org/library/stdtypes.html#set或者如果 python2.4 及更低版本:http://docs.python.org/library/sets.html

这是另一种使用正则表达式解析列表中所有文件的解决方案。

import os
import re
reg1 = re.compile("d+_d+")
newtxt = []
wd = 'foobar'
for file in os.listdir(wd)
    match = reg1.search(file)
    if match:
        newtxt.append(match.group().replace('_', ' '))      
        print file
    else:
        print("no match found")

最新更新