python模式切割列表中的字符串

时间:2014-06-24 02:44:03

标签: python string parsing pattern-matching cut

我有一个字典变量" d"使用键,整数和值作为字符串列表。

368501900 ['GH131.hmm  ', 'CBM1.hmm  ']
368499531 ['AA8.hmm  ']
368500556 ['AA7.hmm  ']
368500559 ['GT2.hmm  ']
368507728 ['GH16.hmm  ']
368496466 ['AA2.hmm  ']
368504803 ['GT21.hmm  ']
368503093 ['GT1.hmm  ', 'GT4.hmm  ']

代码是这样的:

d = dict()

for key in d:
    dictValue = d[key]

    dictMerged = list(sorted(set(dictValue), key=dictValue.index))
    print (key, dictMerged)

但是,我想在列表中的数字后面删除字符串,这样我就可以得到这样的结果:

368501900 ['GH', 'CBM']
368499531 ['AA']
368500556 ['AA']
368500559 ['GT']
368507728 ['GH']
368496466 ['AA']
368504803 ['GT']
368503093 ['GT']

我认为应该在dictValue和dictMerged之间插入代码,但我无法做出逻辑。 请问,有什么想法吗?

2 个答案:

答案 0 :(得分:2)

在开头导入

    import re

现在在dictValue和dictMerged

之间使用这一行
    new_dict_value = [re.sub(r'\d.*', '', x) for x in dictValue]

然后在下一行使用new_dict_value

答案 1 :(得分:2)

String对象有一个很好的.isdigit()方法。以下是一些用于清理数据的非re解决方案。

普通旧循环:

values = ['GT1.hmm  ', 'GT4.hmm  ']
clean_values = []
for item in values:
    clean_item = []
    for c in item:
        if c.isdigit():
            break
        clean_item.append(c)
    clean_values.append("".join(clean_item))

使用StopIteration异常列出理解​​来充当生成器表达式中的break :( 注意在列表推导中使用此stop()方法不会& #39;工作,它需要一个生成器表达式,通常用()表示,但在.join()内部这些是可选的。

def stop():
    raise StopIteration

values = ['GT1.hmm  ', 'GT4.hmm  ']
clean_values = ["".join(c if not c.isdigit() else stop() for c in item) for item in values]

使用itertools.takewhile列出理解:

from itertools import takewhile

values = ['GT1.hmm  ', 'GT4.hmm  '] 
clean_values = ["".join(takewhile(lambda c: not c.isdigit(),item)) for item in values]

示例源自:

http://tech.pro/tutorial/1554/four-tricks-for-comprehensions-in-python#breaking_the_loop