嘿,我是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]
答案 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]
,无论它出现在哪一行。
=================
这里最好的解决方案是使用正则表达式并跳过整个start
和end
。您可以执行以下操作:
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的字符串,包含十六进制字符或空格。
假设您在每行迭代文件行。