我有一个要解析的文本文档。我希望能够获取"@5c00\n“和"@ffd2\n”以及"@ffd2\n“之间的字符串
@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我尝试使用正则表达式,但这似乎给了我'','‘。
file = open("app_blink.txt","r") #app_blink.txt being the string above
contents = file.read()
data = re.findall('\n(.*)@',contents,re.M)我期望得到:
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']但实际上得到了:
data
['','']发布于 2019-05-21 05:57:34
你们已经很接近了。您需要的是re.DOTALL标志和一个非贪婪的匹配:
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)输出:
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 发布于 2019-05-21 05:55:07
这听起来像是一个正则表达式的工作!
\@[^\n]*\n([^\@]*)\n(?=\@)此正则表达式将匹配:
@ @的所有内容:此部分保存到组#1<>H110@>,然后,换行符全部结束
@ (但不使用该字符)时才接受
举个例子:
>>> 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 '因此,要获取重要内容的列表:
>>> [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 ']或者,用一个更简单的答案:
re.split(r'\@[^\n]*\n', your_string)只要找到以@开头的行,就拆分字符串。
发布于 2019-05-21 05:55:41
检查这个正则表达式:
data = re.findall('^[\d \w]{2,}$',contents,re.M)它只是取十六进制数的行。
https://stackoverflow.com/questions/56228551
复制相似问题