所以我正在编写一个读取串行数据行的Python程序,并将它们与行代码字典进行比较,以确定哪些特定行正在传输。我试图使用正则表达式来过滤掉额外的垃圾线串行读取字符串,但我有一点问题。
我字典中的每个代码都是这样的:T12F8B0A22**F8
。星号是区分每个字符串代码的两个字母数字部分。
这就是我的正则表达式:'/^T12F8B0A22[A-Z0-9]{2}F8$/'
然而,我遇到了一些错误。我的第一个错误是,有一些字符是我仍然需要摆脱的字符串的结尾,这很奇怪,因为我认为$/
表示正则表达式中行的结尾。但是,当我通过调试器运行我的代码时,我注意到在运行以下代码之后:
#regexString contains the serial read line data
regexString = re.sub('/^T12F8B0A22[A-Z0-9]{2}F8$/', '', regexString)
我的字符串看起来像这样:'T12F8B0A2200F8\\r'
我需要摆脱\\r
。
如果由于某种原因我无法用正则表达式来解决这个问题,你如何在python中通过参数发送特定的字符串字符?在这种情况下,我认为这将是长度 - 3?
答案 0 :(得分:1)
你的问题有三个:
1)你的字符串在\r
(新行字符)之前包含额外的\n
(回车符);这在Windows和网络通信协议中很常见;最好从字符串中删除任何尾随空格:
regexString = regexString.rstrip()
2)正如WiktorStribiżew所提到的,你的正则表达式被/
字符所包围 - 某些语言(如Perl)将regexp定义为由/
字符分隔的字符串,但Python不是它们;
3)使用re.sub
的指令实际上是用空字符串替换regexString
的匹配部分 - 我相信这与你想要的完全相反(你想保持< / strong>匹配并删除其他所有内容,对吗?);这就是为什么修复正则表达式会让事情“更糟”。
总而言之,我认为您应该使用此代替当前代码:
m = re.match('T12F8B0A22[A-Z0-9]{2}F8', regexString)
regexString = m.group(0)
答案 1 :(得分:0)
有几种方法可以摆脱&#34; \ r&#34;但首先对您的代码进行一些分析: 1.最终的特殊角色只是&#39; $&#39;不是&#39; $ \&#39;在python中。 2. re.sub将匹配的模式替换为一个字符串(在你的情况下为&#39;&#39;&#39;&#39;在你的情况下)将用空字符串替换你想要获得的字符串,并留下// r
可能的解决方案:
使用简单替换:
regexString.replace('\\r','')
如果你想坚持正则表达式,方法是相同的
pattern = '\\\\r'
match = re.sub(pattern, '',regexString)
2.2如果你想访问不同的组使用re.search
match = re.search('(^T12F8B0A22[A-Z0-9]{2}F8)(.*)',regexString)
match.group(1) # will give you the T12...
match.groupe(2) # gives you the \\r
答案 2 :(得分:0)
只需匹配您要查找的内容即可。几个例子:
import re
data = '''lots of
otherT12F8B0A2212F8garbage
T12F8B0A2234F8around
T12F8B0A22ABF8the
stringsT12F8B0A22CDF8
'''
print(re.findall('T12F8B0A22..F8',data))
[&#39; T12F8B0A2212F8&#39; T12F8B0A2234F8&#39; T12F8B0A22ABF8&#39; T12F8B0A22CDF8&#39;]
m = re.search('T12F8B0A22..F8',data)
if m:
print(m.group(0))
T12F8B0A2212F8