- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试用 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"
注意第四个参数的不同,""
与什么都没有。 checkout 27.005 , 文本模式响应的语法是
+CMGL: <index>,<stat>,<oa/da>,[<alpha>],[<scts>][,<tooa/toda>,<length>]<CR><LF>
<data><CR><LF>
和<alpha>
确实是可选的。是的,编写一个考虑到这一点的正则表达式可能是可能的,但是你会有点徘徊在 two problems land 中。 .
我建议你做的是切换到对响应进行正确的解析,即:从第一个字符开始,并根据预期的参数格式(和存在)以 block 的形式前进。参见 this answer一种快速而肮脏的方法来提取电话号码。它不像我在下面描述的算法那样健壮(例如 comma + 2
假设太多)。
解析响应的绝对正确算法是:
匹配行首的前缀(例如 +CMGL:
)。然后开始解析区分以下标记:
' '
或 '\t'
','
'"'
'\r'
'\n'
对于每个参数,首先忽略任何前导空格。如果得到逗号,则参数不存在,继续解析下一个参数。如果得到回车,下一个字符应该是换行并且到达行尾。如果得到一个非空白非...字符,这是数字参数的开始。收集此参数后面的所有非空白非...字符。在此之后,唯一合法的字符应该是零个或多个空格,后跟逗号或回车。如果获取双引号字符前进到下一个双引号字符,即字符串的末尾(这是安全和正确的,因为即使字符串应包含双引号字符,它们也会被转义但不会转义为 \"
)。在此之后,唯一合法的字符应该是零个或多个空格,后跟逗号或回车。
上面的内容乍一看可能有点让人不知所措,但当你开始处理它时,它实际上并没有那么复杂。
关于python - 在python中解析GSM调制解调器接收到的消息参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15848770/
简而言之:我想从可变参数模板参数中提取各种选项,但不仅通过标签而且通过那些参数的索引,这些参数是未知的 标签。我喜欢 boost 中的方法(例如 heap 或 lockfree 策略),但想让它与 S
我可以对单元格中的 excel IF 语句提供一些帮助吗? 它在做什么? 对“BaselineAmount”进行了哪些评估? =IF(BaselineAmount, (Variance/Baselin
我正在使用以下方法: public async Task Save(Foo foo,out int param) { ....... MySqlParameter prmparamID
我正在使用 CodeGear RAD Studio IDE。 为了使用命令行参数测试我的应用程序,我多次使用了“运行 -> 参数”菜单中的“参数”字段。 但是每次我给它提供一个新值时,它都无法从“下拉
我已经为信用卡类编写了一些代码,粘贴在下面。我有一个接受上述变量的构造函数,并且正在研究一些方法将这些变量格式化为字符串,以便最终输出将类似于 号码:1234 5678 9012 3456 截止日期:
MySql IN 参数 - 在存储过程中使用时,VarChar IN 参数 val 是否需要单引号? 我已经像平常一样创建了经典 ASP 代码,但我没有更新该列。 我需要引用 VarChar 参数吗?
给出了下面的开始,但似乎不知道如何完成它。本质上,如果我调用 myTest([one, Two, Three], 2); 它应该返回元素 third。必须使用for循环来找到我的解决方案。 funct
将 1113355579999 作为参数传递时,该值在函数内部变为 959050335。 调用(main.c): printf("%d\n", FindCommonDigit(111335557999
这个问题在这里已经有了答案: Is Java "pass-by-reference" or "pass-by-value"? (92 个回答) 关闭9年前。 public class StackOve
我真的很困惑,当像 1 == scanf("%lg", &entry) 交换为 scanf("%lg", &entry) == 1 没有区别。我的实验书上说的是前者,而我觉得后者是可以理解的。 1 =
我正在尝试使用调用 SetupDiGetDeviceRegistryProperty 的函数使用德尔福 7。该调用来自示例函数 SetupEnumAvailableComPorts .它看起来像这样:
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
rails 新手。按照多态关联的教程,我遇到了这个以在create 和destroy 中设置@client。 @client = Client.find(params[:client_id] || p
通过将 VM 参数设置为 -Xmx1024m,我能够通过 Eclipse 运行 Java 程序-Xms256M。现在我想通过 Windows 中的 .bat 文件运行相同的 Java 程序 (jar)
我有一个 Delphi DLL,它在被 Delphi 应用程序调用时工作并导出声明为的方法: Procedure ProduceOutput(request,inputs:widestring; va
浏览完文档和示例后,我还没有弄清楚 schema.yaml 文件中的参数到底用在哪里。 在此处使用 AWS 代码示例:https://github.com/aws-samples/aws-proton
程序参数: procedure get_user_profile ( i_attuid in ras_user.attuid%type, i_data_group in data_g
我有一个字符串作为参数传递给我的存储过程。 dim AgentString as String = " 'test1', 'test2', 'test3' " 我想在 IN 中使用该参数声明。 AND
这个问题已经有答案了: When should I use "this" in a class? (17 个回答) 已关闭 6 年前。 我运行了一些java代码,我看到了一些我不太明白的东西。为什么下
我输入 scroll(0,10,200,10);但是当它运行时,它会传递字符串“xxpos”或“yypos”,我确实在没有撇号的情况下尝试过,但它就是行不通。 scroll = function(xp
我是一名优秀的程序员,十分优秀!