Python多行正则表达式

Python多行正则表达式,python,regex,multiline,Python,Regex,Multiline,需要获得括号和二进制blob数据之间的内容,在带有“纹理”的行之后,直到到达空行为止。有几个“纹理”段落 到目前为止,我得到的是: input = """ endless gibberish some more stuff color texture mytexture [640 480 1] 'BE4C16FFBD4B15FFBD4B15FFBD4B15FFBD4B15FFBE4C16FFBE4C16FFBD4B15FFBD4B15FF' 'BE4C16FFBE4C1

需要获得括号和二进制blob数据之间的内容,在带有“纹理”的行之后,直到到达空行为止。有几个“纹理”段落

到目前为止,我得到的是:

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...)
---------------