Python多行正则表达式
需要获得括号和二进制blob数据之间的内容,在带有“纹理”的行之后,直到到达空行为止。有几个“纹理”段落 到目前为止,我得到的是:Python多行正则表达式,python,regex,multiline,Python,Regex,Multiline,需要获得括号和二进制blob数据之间的内容,在带有“纹理”的行之后,直到到达空行为止。有几个“纹理”段落 到目前为止,我得到的是: input = """ endless gibberish some more stuff color texture mytexture [640 480 1] 'BE4C16FFBD4B15FFBD4B15FFBD4B15FFBD4B15FFBE4C16FFBE4C16FFBD4B15FFBD4B15FF' 'BE4C16FFBE4C1
input = """
endless gibberish
some more stuff
color texture mytexture
[640 480 1]
'BE4C16FFBD4B15FFBD4B15FFBD4B15FFBD4B15FFBE4C16FFBE4C16FFBD4B15FFBD4B15FF'
'BE4C16FFBE4C16FFBD4B15FFBC4A14FFBC4A14FFBC4A14FFBC4A14FFBC4A14FFBE4C16FF'
'BF4C16FFBF4C16FFBE4B15FFBE4B15FFBC4913FFBC4913FFBC4913FFBB4812FFBC4913FF'
'BC4A14FFBB4913FFBB4812FFBB4812FFBA4812FFBA4812FFBB4913FFBC4A16FFBB4915FF'
'B84612FFB84612FFB94713FFB84612FFB64410FFB64410FFB64410FFB4420EFFB3410DFF'
'FB03E0AFFB13F0BFB13F0BFFAE3C08FFAA3804FFAD3B07FFB03E0AFFB3410DFFB4420EFF'
'B4400DFFB13D0AFFB23C0AFFB03C09FFB23E0BFFB5410EFFB74310FFB94512FFB84411FF'
color texture mytexture2
[640 480 1]
'BE4C16FFBD4B15FFBD4B15FFBD4B15FFBD4B15FFBE4C16FFBE4C16FFBD4B15FFBD4B15FF'
'BE4C16FFBE4C16FFBD4B15FFBC4A14FFBC4A14FFBC4A14FFBC4A14FFBC4A14FFBE4C16FF'
(... etc...)
"""
提供以下输出:
p = re.compile(r'texture\s+(\S+)\s+\[(\d+\s+\d+\s+\d+)\]\s+(\'.+\')')
matches = p.findall(data)
for match in matches:
print match[0]
print match[1]
print match[2]
print "---------------"
我非常确定应该使用re.MULTILINE来获取整个blob,但我不清楚如何获取所有二进制行。
我的问题基本上是:一个人如何抓取多行并知道何时“停止”(即:到达空行)。你是正确的,只是没有达到实际实施的程度;)
re.MULTILINE
影响^
和$
锚定的含义。我认为您需要的是re.DOTALL
,没有它,
字符将永远不会匹配换行符
要将所有文本匹配到下一个空行,可以使用类似于(.*?)\n\s*\n
。这似乎符合你的要求
import re
input = """
endless gibberish
some more stuff
texture mytexture
'01AB01AB01AB01BA'
'01AB01AB01AB01BA'
'01AB01AB01AB01BA'
'01AB01AB01AB01BA'
"""
matches = re.findall(r'01AB01AB01AB01BA', input, re.M)
print matches
在示例文本上,这将生成:
p = re.compile(r'texture\s+(\S+)\s+\[(\d+\s+\d+\s+\d+)\]\s+(.*?)\n\s*\n', re.DOTALL)
matches = p.findall(input)
for match in matches:
print match[0]
print match[1]
print match[2]
print "---------------"
这让我怀疑OP是否尝试过任何东西,因为你所做的只是把他们的话直接翻译成代码。我的错。我被-2代表惩罚是正确的。希望编辑的帖子更清楚。是的,这正是我想要的,谢谢!我也尝试了re.DOTALL,但未能在空行上使regexp“停止”。因此,
(.*)\n\s*\n
和DOTALL保存了我的一天。我猜我也误解了MULTILINE标志:在使用re.MULTILINE之前,SI必须返回并重新阅读文档,以确保我正确使用它:-P
p = re.compile(r'texture\s+(\S+)\s+\[(\d+\s+\d+\s+\d+)\]\s+(.*?)\n\s*\n', re.DOTALL)
matches = p.findall(input)
for match in matches:
print match[0]
print match[1]
print match[2]
print "---------------"
mytexture
640 480 1
'BE4C16FFBD4B15FFBD4B15FFBD4B15FFBD4B15FFBE4C16FFBE4C16FFBD4B15FFBD4B15FF'
'BE4C16FFBE4C16FFBD4B15FFBC4A14FFBC4A14FFBC4A14FFBC4A14FFBC4A14FFBE4C16FF'
'BF4C16FFBF4C16FFBE4B15FFBE4B15FFBC4913FFBC4913FFBC4913FFBB4812FFBC4913FF'
'BC4A14FFBB4913FFBB4812FFBB4812FFBA4812FFBA4812FFBB4913FFBC4A16FFBB4915FF'
'B84612FFB84612FFB94713FFB84612FFB64410FFB64410FFB64410FFB4420EFFB3410DFF'
'FB03E0AFFB13F0BFB13F0BFFAE3C08FFAA3804FFAD3B07FFB03E0AFFB3410DFFB4420EFF'
'B4400DFFB13D0AFFB23C0AFFB03C09FFB23E0BFFB5410EFFB74310FFB94512FFB84411FF'
---------------
mytexture2
640 480 1
'BE4C16FFBD4B15FFBD4B15FFBD4B15FFBD4B15FFBE4C16FFBE4C16FFBD4B15FFBD4B15FF'
'BE4C16FFBE4C16FFBD4B15FFBC4A14FFBC4A14FFBC4A14FFBC4A14FFBC4A14FFBE4C16FF'
(... etc...)
---------------