繁体   English   中英

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

[英]strip text to create list and compare 2 similar lists

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

import os
newtxt = []
oldtxt = '\foobar\master_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我需要检查在遗漏值newtxtoldtxt 。我已经试过这样:

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'

一些评论(以及您自己想到的解决方案的路径):

  • 确保你逃脱\\ in \\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] .split('_')
#Note l = ['1','10']

如果你需要'1 10',那就去做吧

item =''。join(l)

要做'diff',请使用set difference(用法取决于你运行的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")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM