在python中,使用通过串行端口连接到笔记本电脑的GSM调制解调器接收的正则表达式解析字符串

在python中,使用通过串行端口连接到笔记本电脑的GSM调制解调器接收的正则表达式解析字符串,python,regex,string,parsing,gsm,Python,Regex,String,Parsing,Gsm,这是我用来轮询通过串行端口连接到笔记本电脑的GSM调制解调器接收到的新消息的功能。我已经创建了一个串行对象“phone”,我正在使用它读取和写入数据 “电话”将数据读入列表x 当我收到一条新消息时,我得到的响应的格式如下: +CMTI: "SM",0 这里0是一个索引,表示SIM卡上存储消息的索引位置。 下面的代码用于轮询包含我正在读写的数据的列表x 从串行端口。我正在使用正则表达式解析已转换为字符串myRegexableString的x,以查看是否收到通知 def poll(x):

这是我用来轮询通过串行端口连接到笔记本电脑的GSM调制解调器接收到的新消息的功能。我已经创建了一个串行对象“phone”,我正在使用它读取和写入数据

“电话”将数据读入列表x

当我收到一条新消息时,我得到的响应的格式如下:

+CMTI: "SM",0
这里0是一个索引,表示SIM卡上存储消息的索引位置。 下面的代码用于轮询包含我正在读写的数据的列表x 从串行端口。我正在使用正则表达式解析已转换为字符串myRegexableString的x,以查看是否收到通知

def poll(x):
    myRegexableString = "".join(x)
    print "Printing myRegexableString"
    pprint(myRegexableString)
    regex = re.compile(r'\+CMTI: "SM",(\d+)')
    lst = []
    for l in myRegexableString:
        for m in [regex.search(l)]:
            if myRegexableString:
                lst.append(m)
                print "You have received a new message!"
我想将上面的代码用于检查网络注册的AT命令。在执行其他命令时,我也需要轮询新消息,或者执行其他命令,但出于这个问题的考虑,我将以网络注册为例。下面是它在不使用轮询函数的情况下正常运行的方式

AT+CREG? #command

+CREG: 0,1 #response

OK #status
下面是代码

def register():
   print "Checking for network registration"
   phone.write(b'AT+CREG?\r')
   sleep()
   x=phone.read(50)
   sleep()
   print x
现在假设我在这里包含轮询,代码将更改为

def register():
       print "Checking for network registeration"
       phone.write(b'AT+CREG?\r')
       sleep()
       x=phone.read(50)
       poll(x)
       sleep()
       print x
我从更改的代码中得到的输出是

Checking for network registeration
Printing myRegexableString
'AT+CREG?\r\r\n+CREG: 0,1\r\n\r\nOK\r\n'
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
You have received a new message!
AT+CREG?

+CREG: 0,1

OK
为什么它会多次打印“你收到了一条新消息!”

尤其是当我还没有收到新消息的时候


请提供帮助。

您只需使用
regex.findall(myRegexableString)
。这将返回一个匹配组的列表,所以是数字

regex = re.compile(r'\+CMTI: "SM",(\d+)')

def poll(x):
    myRegexableString = "".join(x)
    print "Printing myRegexableString"
    pprint(myRegexableString)
    lst = regex.findall(myRegexableString)
我已经将
re.compile()
调用移出了函数,没有必要每次都重新编译表达式

myRegexableString
的每个字符上循环,然后在一个匹配的列表上循环,然后测试
myRegexableString
是否为True(如果不是空的话)。这意味着对输入中的每个字符添加一个空匹配项(表达式永远不会匹配单个字符串中的任何内容)