正则表达式行尾和特定字符

时间:2017-06-27 13:00:10

标签: python regex pyserial

所以我正在编写一个读取串行数据行的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?

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

可能的解决方案:

  1. 使用简单替换:

     regexString.replace('\\r','')
    
  2. 如果你想坚持正则表达式,方法是相同的

    pattern = '\\\\r'         
    match = re.sub(pattern, '',regexString)
    
  3. 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