我正在尝试用 python 解析从 GSM 调制解调器收到的消息。
我有很多消息需要解析。我每隔几个小时左右就会收到新消息。
这是我通过使用串行对象到列表 x 中从调制解调器读取数据后收到的数据示例。
AT+CMGL="ALL"
+CMGL: 1,"REC READ","+918884100421","","13/04/05,08:24:36+22"
here's message one
+CMGL: 2,"REC READ","+918884100421","","13/04/05,09:40:38+22"
here's message two
+CMGL: 3,"REC READ","+918884100421","","13/04/05,09:41:04+22"
here's message three
+CMGL: 4,"REC READ","+918884100421","","13/04/05,10:04:18+22"
here's message four
+CMGL: 5,"REC READ","+918884100421","","13/04/05,10:04:32+22"
here's message five
.
.
.
.
.
还有很多消息,我在这里只列出了五条。
我的主要目的是提取消息的内容,例如我收到的每条消息的“这是消息一”等等。
这是我现在正在使用的代码。
def reading():
print "Reading all the messages stored on SIM card"
phone.write(b'AT+CMGL="ALL"\r')
sleeps()
x=phone.read(10000)
sleeps()
print x
print "Now parsing the message!"
k="".join(x)
parse(k)
k=""
def parse(k):
m = re.search("\+CMGL: (\d+),""(.+)"",""(.+)"",(.*),""(.+)""\r\n(.+)\r\n",k)
print "6="
print m.group(6)
Phone 是我用来从 GSM 调制解调器读取数据的串行对象。
这里 m.group(6) 捕获第一条消息“here's message one”的消息内容
如何让它匹配所有消息的内容,而不仅仅是第一条消息。
我尝试设置多行标志,但没有成功。使用 re.findall() 代替 re.search() 也没有效果。
此外,re.search 返回的匹配对象不可迭代。
请帮忙。
最佳答案
为此使用正则表达式并不是一个非常可靠的解决方案,因为它无法处理不同手机行为的变化。在您的示例中,响应的格式是
+CMGL: 1,"REC READ","+918884100421","","13/04/05,08:24:36+22"
但其他手机会给出类似的响应
+CMGL: 1,"REC READ","+31612123738",,"08/12/22,11:37:52+04"
请注意第四个参数 ""
的差异与什么都没有。
查看27.005 ,文本模式下响应的语法为
+CMGL: <index>,<stat>,<oa/da>,[<alpha>],[<scts>][,<tooa/toda>,<length>]<CR><LF>
<data><CR><LF>
和<alpha>
确实是可选的。是的,可能可以编写一个考虑到这一点的正则表达式,但随后您会陷入two problems land .
我建议您做的是切换到对响应进行正确的解析,即:从第一个字符开始,并根据预期的参数格式(和存在)分块前进。请参阅this answer一种快速而肮脏的方法来提取电话号码。它不如我在下面描述的算法那么强大(例如 comma + 2
假设太多)。
解析响应的绝对正确算法是:
匹配行开头的前缀(例如 +CMGL:
)。然后开始解析区分以下标记:
- 空白
' '
或'\t'
- 逗号
','
- 双引号
'"'
- 回车
'\r'
- 换行
'\n'
- 任何非空白、非逗号、非双引号、非 cr、非 lf 字符
对于每个参数,首先忽略任何前导空格。
如果得到逗号,则该参数不存在,则继续解析下一个参数。
如果得到回车,则下一个字符应该换行并且到达行尾。如果获得非空白非...字符,则这是数字参数的开始。收集此参数后面的所有非空白非...字符。在此之后,唯一的合法字符应该是零个或多个空格,后跟逗号或回车符。
如果获取双引号字符前进到下一个双引号字符,即字符串的末尾(这是安全且正确的,因为即使字符串应包含双引号字符,它们也会被转义,但不会作为 \"
)。在此之后,唯一的合法字符应该是零个或多个空格,后跟逗号或回车符。
上面的内容一开始可能看起来有点让人不知所措,但是当你开始处理它时,它实际上并没有那么复杂。
关于python - 在python中解析GSM调制解调器接收到的消息参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15848770/