消除python脚本中最后一个字符串后的文本

时间:2016-12-01 12:10:08

标签: python dictionary

从表文件创建字典,其中某些列具有特殊字符,如“|”但是我需要在最后一个“|”之后删除所有文本。

例如:

A     this_is|my_A|best|result|      20
B     this_is|my_B|best|result|mess  40
C     this_is|my_C|best|result|me..  32

我写这个来创建字典:

for line in file:
        query = line.strip().split('\t')[0]
        data =  line.strip().split('\t')[1:2]
        subject = line.strip().split('\t')[1]
        if query not in best_hit:
                best_hit[subject] = data

导致像这样的混乱字典:

d = {'A': 'this_is|my_A|best|result|, 20' ,'B': 'this_is|my_B|best|result|mess  40', 'C':'this_is|my_C|best|result|me..  32' }

我的目的是消除“混乱”和“我......”文本,然后将其包含在字典中,因为我需要将此值与其他没有这些文本的列表进行比较。

A     this_is|my_A|best|result|      20
B     this_is|my_B|best|result|      40
C     this_is|my_C|best|result|      32

我自己的解决方案:

old_result = line.strip().split('\t')[1]
new_result = old_result.split('|')
subject = new_result[0]+'|'+new_result[1]+'|'+new_result[2]+'|'+new_result[3]+'|

6 个答案:

答案 0 :(得分:1)

鉴于你已经在字典中读过,如果我理解正确的话,这应该这样做:

def get_last_num(s):
  i = len(s)-1
  for ch in reversed(s):
    if ch not in ['1','2','3','4','5','6','7','8','9','0']:
      return s [i:]
    i -= 1

d = {'A': 'this_is|my_A|best|result|, 20' , \
     'B': 'this_is|my_B|best|result|mess  40', \
     'C': 'this_is|my_C|best|result|me..  32' }

for key in d:
  last_bar = d [key].rfind('|')
  d [key] = d [key][:last_bar] + get_last_num(d [key])

print(d)

(打印出来):

{'A': 'this_is|my_A|best|result 20', 'C': 'this_is|my_C|best|result 32', 'B': 'this_is|my_B|best|result 40'}

答案 1 :(得分:1)

您正在寻找如何转变'this_is|my_B|best|result|mess 40' 进入this_is|my_b|best|result 40

说s是你的字符串,

last_delimiter_index =len(s)- s[::-1].index('|')
s = s[:last_delimiter_index-1] +" "+ s.split()[1]

它的作用是获取分隔符的最后一个索引,在您的情况下为“|”并构造一个类似于你想要的新的/ s[::-1]正在反转字符串,如果它似乎不熟悉

答案 2 :(得分:1)

你可以试试这个:

results = (
    'A  this_is|my_A|best|result|   20\n'
    'B  this_is|my_B|best|result|mess   40\n'
    'C  this_is|my_C|best|result|me..   32'
)
keepCols = 4 ## number of cols you want keep
mydict = {}

for line in results.split('\n'):
    splited = line.split('\t')
    data = ''

    for x, col in enumerate(splited[1].split('|')):
        if x + 1 == keepCols:
            break
        data += col + '|'

    mydict[splited[0]] = data + ', ' + splited[2]

print(mydict)

答案 3 :(得分:1)

拆分可能不是性能方面的,但算法更简单。

source = """

A   this_is|my_A|best|result|   20
B   this_is|my_B|best|result|mess   40
C   this_is|my_C|best|result|me..   32

"""

source = source.strip()
source = source.split('\n')

result = {}

for i in xrange(len(source)):
    asplit = source[i].split('\t')
    bsplit = asplit[1].split('|')
    bsplit[-1] = ''
    asplit[1] = '|'.join(bsplit)

    if not asplit[0] in result:
        result[asplit[0]] = asplit[1] + '\t' + asplit[2]

print result

答案 4 :(得分:1)

您可以在阅读文件或拥有字典时消除。在我的解决方案中,我将清理字典:

import re #To use regular expresion
#Your example Dict
d = {'A': 'this_is|my_A|best|result|, 20' ,'B': 'this_is|my_B|best|result|mess  40', 'C':'this_is|my_C|best|result|me..  32' }
for k,v in d.items():
    text = v.split("|")[-1]
    text_clean = re.sub('\\D', '', text)
    v_result = "|".join(v.split("|")[:-1])+"|"+text_clean
    d[k] = v_result

结果:

print(d)
{'A': 'this_is|my_A|best|result|20', 'C': 'this_is|my_C|best|result|32', 'B': 'this_is|my_B|best|result|40'}

答案 5 :(得分:1)

在制表符分隔数据中查找最后一个管道字符的有效方法是在选项卡上拆分每个剥离的行,然后使用str.rfind方法。

src = '''\
A\tthis_is|my_A|best|result|\t20
B\tthis_is|my_B|best|result|mess\t40
C\tthis_is|my_C|best|result|me..\t32
'''.splitlines()

result = {}
for line in src:
    key, text, num = line.strip().split('\t')
    result[key] = text[:text.rfind('|')] + '|\t' + num

# display contents of `result`, with the keys in alphabetical order
for k in sorted(result.keys()):
    print(k, result[k])

<强>输出

A this_is|my_A|best|result|     20
B this_is|my_B|best|result|     40
C this_is|my_C|best|result|     32

如果.rfindtext中找不到管道字符,它将返回-1,因此如果text不包含管道字符,我的代码将只是附加管道之一。