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

Regex End of Line and Specific Chracters

所以我正在编写一个 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 中如何通过参数发送特定的字符串字符?在这种情况下,我想它应该是 length - 3?

您的问题有三方面:

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

regexString = regexString.rstrip()

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

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

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

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

有几种方法可以去掉“\r”,但首先要对您的代码进行一些分析: 1. python中结尾的特殊字符只是'$'而不是'$\'。 2. re.sub 会将匹配的模式替换为字符串(在您的情况下为 '' ),这会将您想要获取的字符串替换为空字符串,您将剩下 //r

可能的解决方案:

  1. 使用简单替换:

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

    pattern = '\\r'         
    match = re.sub(pattern, '',regexString)
    

2.2 如果你想要访问不同的 grubs 使用 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

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

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