【问题标题】:Regex End of Line and Specific Chracters正则表达式行尾和特定字符
【发布时间】:2017-06-27 13:00:10
【问题描述】:

所以我正在编写一个 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?

【问题讨论】:

  • 只有几个错误?好吧,由于正则表达式分隔符,我怀疑它是否有效。您必须删除 /s。请注意$ 是一个零宽度断言,您需要在$ 之后添加[\r\n]* 以消耗任何换行符。试试'(?m)^T12F8B0A22[A-Z0-9]{2}F8$[\r\n]*'
  • 删除/ 会使它工作得更糟:\ 编辑:感谢您的帮助,但您的建议并没有解决问题,事实上它消除了很多我的字符串修剪实际工作。
  • r 标签表示 r 语言 -- 建议你删除它。

标签: python regex pyserial


【解决方案1】:

你的问题有三个:

1) 您的字符串在\n(换行符)之前包含额外的\r(回车符);这在 Windows 和网络通信协议中很常见;最好从字符串中删除任何尾随空格:

regexString = regexString.rstrip()

2) 正如 Wiktor Stribiżew 所提到的,您的正则表达式不必要地被 / 字符包围 - 某些语言(如 Perl)将正则表达式定义为由 / 字符分隔的字符串,但 Python 不是其中之一;

3) 您使用re.sub 的指令实际上是用空字符串替换regexString 的匹配部分 - 我相信这与您想要的完全相反(您想要保留匹配并删除其他所有内容,对吗?);这就是为什么修复正则表达式会使事情“更糟”。

总而言之,我认为您应该使用此代码而不是当前代码:

m = re.match('T12F8B0A22[A-Z0-9]{2}F8', regexString)
regexString = m.group(0)

【讨论】:

    【解决方案2】:

    有几种方法可以摆脱“\r”,但首先对您的代码进行一点分析: 1.结束的特殊字符只是'$'而不是python中的'$\'。 2. re.sub 将用字符串替换匹配的模式(在您的情况下为 '' ),它将用空字符串替换您想要获取的字符串,然后您将得到 //r

    可能的解决方案:

    1. 使用简单替换:

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

      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
    

    【讨论】:

      【解决方案3】:

      只需匹配您要查找的内容即可。几个例子:

      import re
      
      data = '''lots of
      otherT12F8B0A2212F8garbage
      T12F8B0A2234F8around
      T12F8B0A22ABF8the
      stringsT12F8B0A22CDF8
      '''
      
      print(re.findall('T12F8B0A22..F8',data))
      

      ['T12F8B0A2212F8', 'T12F8B0A2234F8', 'T12F8B0A22ABF8', 'T12F8B0A22CDF8']

      m = re.search('T12F8B0A22..F8',data)
      if m:
          print(m.group(0))
      

      T12F8B0A2212F8

      【讨论】:

        猜你喜欢
        • 2017-09-17
        • 1970-01-01
        • 1970-01-01
        • 2013-10-27
        • 2021-05-06
        • 2023-01-02
        • 1970-01-01
        • 1970-01-01
        • 2010-09-15
        相关资源
        最近更新 更多