Python - 附加的字符丢失

时间:2017-07-07 11:44:47

标签: python syntax

嘿,我是python的新手,我正在编写一个脚本来对某些关键字的文件进行排序,一切正常,除了我不理解的小读/打印错过...这是我的问题代码和扫描文件:

File:
    SEND TEST
    Tester -> 1FFF 19 02 0F :\user\log
    SEND TEST
    Tester -> 1FFF 18 00 0F [Channel 1] :\user\log
    SEND TEST
    Tester -> 1FFF 12 11 5F :\user\log
    SEND TEST
    Tester -> 1FFF 12 55 1F [Channel 1] :\user\log
    SEND TEST
    Tester -> 1FFF 19 03 2F :\user\log
code:
      if line.startswith('Tester ->'):
         start = 'Tester -> '  # take string from
         end = ':\ ' # end at
         data.append(line[line.find(start) + 9 :line.find(end)].strip('[Channel 1]'))

打印

1FFF 19 02 0F
1FFF 18 00 0F [Channel 1]
1FFF 12 11 5F
1FFF 12 55 1F [Channel 1]
1FFF 19 03 2F 

data.append字符串有问题,如print i中所示,但我想提取代码ex 1FFF 12 55 1F但不提取[Channel 1] aslo ...所以我用过。剥去它,然后我得到这个印刷品:

1FFF 19 02 0F
FFF 18 00 0F
1FFF 12 11 5F
FFF 12 55 1F
1FFF 19 03 2F 

[Channel 1]的所有字符串都会丢失第一个字符,如果我在8中放置了9而不是data.apped,则会打印出来:

1FFF 19 02 0F
> 1FFF 18 00 0F
1FFF 12 11 5F
> 1FFF 12 55 1F
1FFF 19 03 2F

然后从>获取Tester ->,我不明白为什么?它出于某种原因跳过了两者之间的角色?就像当我有一个9时,它会计算每个字符,包括空格,当我有一个8时,它会对字符进行计数,但不包括空格......这怎么可能?有人知道如何解决这个问题,谢谢!

# Sending Request: Tester -> 1631 11 33 F5 :\ APP_3130 \ Read Identifier \ 
Tester -> 1631 22 F1 2E :\ APP_3138 \ Read Identifier \ 
Tester -> 1FFF 19 02 0F [Channel 1]

2 个答案:

答案 0 :(得分:1)

问题在于strip('chars')删除了'chars'的所有组合,如下所示:https://docs.python.org/3/library/stdtypes.html?highlight=strip#str.strip

所以你真正要说的是从我的字符串中删除字符[, C, h, a, , n, e, l, 1, and ]

如果您只想删除[Channel 1],我会执行以下操作:

import re

line = re.sub(r"\[Channel 1\]$", "", line)

此正则表达式模式仅匹配文本[Channel 1](如果它是行尾)。

或者如果您不想包含正则表达式模块,可以使用

line = line.replace("[Channel 1]", "")

此解决方案将替换[Channel 1],无论它出现在哪一行。

=================

这里最好的解决方案是使用正则表达式并跳过整个startend。您可以执行以下操作:

import re

pattern = re.compile(r"Tester ->\s((?:(?:\w+)+\s)+)(?:\[Channel \d\])?\s?[:]")
if line.startswith('Tester ->'):
    m = pattern.match(line)
    if m is not None:
        data.append(m.group(1).strip())

答案 1 :(得分:0)

这是一个使用正则表达式的版本:

import re

rgx = re.compile('Tester\ ->\ ([0-9a-fA-F\ ]{13})')

for line in file:
    match = rgx.match(line)
    if match:
        data.append(match.group(1))

print(data)
# ['1FFF 19 02 0F', '1FFF 18 00 0F', '1FFF 12 11 5F', 
#  '1FFF 12 55 1F', '1FFF 19 03 2F']

正则表达式匹配字符串'Tester -> ',后跟长度为13的字符串,包含十六进制字符或空格。

假设您在每行迭代文件行。