Python附加字符丢失
嘿,我对python还很陌生,我正在编写一个脚本来对文件中的一些关键字进行排序,除了一个我不懂的小的阅读/打印错误之外,一切都很好。。。这是我的问题代码和我正在扫描的文件:Python附加字符丢失,python,syntax,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 -> 1F
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
字符串有问题,如我工作的打印中所示,但我想提取代码ex1FFF 12 55 1F
,而不是[Channel 1]
。。。所以我用了.strip来删除它,但是我得到了这个打印:
1FFF 19 02 0F
FFF 18 00 0F
1FFF 12 11 5F
FFF 12 55 1F
1FFF 19 03 2F
所有具有[Channel 1]
的字符串都会丢失第一个字符,如果我在数据中放置8而不是9
。apped
会打印:
1FFF 19 02 0F
> 1FFF 18 00 0F
1FFF 12 11 5F
> 1FFF 12 55 1F
1FFF 19 03 2F
然后它从测试仪->
获取
,我不明白为什么?出于某种原因,它跳过了中间的角色?这就像当我有一个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]
问题是strip('chars')
删除了'chars'
的所有组合,如下所述:
所以你真正想说的是从我的字符串中删除字符[,C,h,a,n,e,l,1和]
如果您只想删除[Channel 1]
,我将执行以下操作:
import re
line = re.sub(r"\[Channel 1\]$", "", line)
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())
此正则表达式模式仅与作为行尾的文本相匹配
或者,如果不想包含regex模块,可以使用
line = line.replace("[Channel 1]", "")
此解决方案将取代[Channel 1]
,无论它显示在线路的何处
=================
这里最好的解决方案是使用正则表达式并跳过整个start
和end
过程。您可以执行以下操作:
import re
line = re.sub(r"\[Channel 1\]$", "", line)
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())
这是一个使用正则表达式的版本:
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的字符串
这是假设您每行迭代文件行。我不是python程序员,但看起来您的结束分隔符是可变的:和[将表示字符串的结尾。我认为您应该查找其中一个,而不是在事实发生后试图去掉多余的字符。您应该阅读。我可以建议,但由于您是新手,这可能是太多的信息-因此如果您知道要查找的字符串的长度,您不会line[line.find(start)+9:line.find(开始)+9+14]
玩这个把戏吗?你可以建议使用replace(“[Channel 1]”,“)
相反,你会得到我的支持票。@Jean-FrançoisFabre haha我刚刚编辑了它,如果你建议使用正则表达式,你最好使用re.match
重写一个解决方案。毕竟,这就是搜索文本的意义。@Kendas你为什么要使用匹配从字符串中删除一个内容呢?这是一个很大的额外开销。挑剔:既然你提出了re
,为什么不添加$
,因为最终的模式似乎是这样的:这比str.replace
要好。