首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从字符串中提取特定数据?

如何从字符串中提取特定数据?
EN

Stack Overflow用户
提问于 2019-05-21 05:43:50
回答 5查看 56关注 0票数 0

我有一个要解析的文本文档。我希望能够获取"@5c00\n“和"@ffd2\n”以及"@ffd2\n“之间的字符串

代码语言:javascript
复制
@5c00
81 00 00 5C B1 13 3E 01 0C 43 B1 13 A6 00 1C 43 
B1 13 38 01 32 D0 10 00 FD 3F 03 43 00 00 00 02 
@ffd2
14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 
14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 
14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 00 5C CF 0C 
@
q

我尝试使用正则表达式,但这似乎给了我'','‘。

代码语言:javascript
复制
file = open("app_blink.txt","r") #app_blink.txt being the string above
contents = file.read()
data = re.findall('\n(.*)@',contents,re.M)

我期望得到:

代码语言:javascript
复制
data
['81 00 00 5C B1 13 3E 01 0C 43 B1 13 A6 00 1C 43 \nB1 13 38 01 32 D0 10 00..
 FD 3F 03 43 00 00 00 02','14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C..
 \n14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C \n14 5C 14 5C 14 5C 14..
 5C 14 5C 14 5C 00 5C CF 0C \n']

但实际上得到了:

代码语言:javascript
复制
data
['','']
EN

回答 5

Stack Overflow用户

发布于 2019-05-21 05:57:34

你们已经很接近了。您需要的是re.DOTALL标志和一个非贪婪的匹配:

代码语言:javascript
复制
contents = '''\
@5c00
81 00 00 5C B1 13 3E 01 0C 43 B1 13 A6 00 1C 43 
B1 13 38 01 32 D0 10 00 FD 3F 03 43 00 00 00 02 
@ffd2
14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 
14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 
14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 00 5C CF 0C 
@
q
'''

import re
for x in re.findall(r'\n(.*?)@',contents,re.DOTALL):
    print(x)

输出:

代码语言:javascript
复制
81 00 00 5C B1 13 3E 01 0C 43 B1 13 A6 00 1C 43 
B1 13 38 01 32 D0 10 00 FD 3F 03 43 00 00 00 02 

14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 
14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 
14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 00 5C CF 0C 
票数 1
EN

Stack Overflow用户

发布于 2019-05-21 05:55:07

这听起来像是一个正则表达式的工作!

代码语言:javascript
复制
\@[^\n]*\n([^\@]*)\n(?=\@)

此正则表达式将匹配:

  • First,一个文字@
  • 然后,任何一行字符,以换行符
  • 结束,然后,它能找到的不包括@的所有内容:此部分保存到组#1

<>H110@>,然后,换行符全部结束

  • 最后,仅当下一个字符是@ (但不使用该字符)

时才接受

举个例子:

代码语言:javascript
复制
>>> re.search(r'\@[^\n]*\n([^\@]*)\n(?=\@)', your_string).group(1)
'81 00 00 5C B1 13 3E 01 0C 43 B1 13 A6 00 1C 43 \nB1 13 38 01 32 D0 10 00 FD 3F 03 43 00 00 00 02 '

因此,要获取重要内容的列表:

代码语言:javascript
复制
>>> [m.group(1) for m in re.finditer(r'\@[^\n]*\n([^\@]*)\n(?=\@)', your_string)]
['81 00 00 5C B1 13 3E 01 0C 43 B1 13 A6 00 1C 43 \nB1 13 38 01 32 D0 10 00 FD 3F 03 43 00 00 00 02 ', '14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C \n14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C \n14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 00 5C CF 0C ']

或者,用一个更简单的答案:

代码语言:javascript
复制
re.split(r'\@[^\n]*\n', your_string)

只要找到以@开头的行,就拆分字符串。

票数 0
EN

Stack Overflow用户

发布于 2019-05-21 05:55:41

检查这个正则表达式:

代码语言:javascript
复制
data = re.findall('^[\d \w]{2,}$',contents,re.M)

它只是取十六进制数的行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56228551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档