将多行生成行变量赋值与python regexp匹配

将多行生成行变量赋值与python regexp匹配,python,regex,multiline,Python,Regex,Multiline,我试图从多行生成行变量赋值中提取多行值。下面的测试用例在输入字符串中找不到匹配项,我不得不承认我不明白为什么。非常欢迎提供有关在标准输出上打印“a\b”示例代码的帮助 #!/usr/bin/env python def test(): s = r"""

我试图从多行生成行变量赋值中提取多行值。下面的测试用例在输入字符串中找不到匹配项,我不得不承认我不明白为什么。非常欢迎提供有关在标准输出上打印“a\b”示例代码的帮助

#!/usr/bin/env python                                                                                                 

def test():
    s = r"""                                                                                                          
FOO=a \                                                                                                               
  b                                                                                                                   
"""
    import re
    print type(s),s
    regex = re.compile(r'^FOO=(.+)(?<!\\)$', re.M)
    m = regex.search(s)
    print m.group(1)

if __name__ == '__main__':
    test()
#/usr/bin/env python
def test():
s=r
FOO=a
B
"""
进口稀土
打印类型

regex=re.compile(r'^FOO=(.+)(?我想出了这个:

^FOO=((([^\\]*\\\n)*)[^\n]+)

它假定反斜杠后面没有空格。

您的问题是默认情况下,
与换行符不匹配。如果启用“点所有”修改器,它将起作用

regex = re.compile(r'^FOO=(.+)(?<!\\)$', re.M | re.S)
您的图案与包括换行符在内的图案完全匹配

我不确定您想用多行修饰符
re.M
实现什么。它使
^
$
匹配行的开始/结束。我假设您可以删除它


我也不确定您想通过反向查找实现什么
(?,我认为您应该澄清您的预期输出。(是否要删除a\b中的换行?)

re.M表示re.MULTILINE,但它与点的符号无关,它与^and的符号有关$

您需要指定re.DOTALL以使点能够与“\n”匹配

def test():
    s = r"""    

FOO=a \    

  b

  """
    import re
    print repr(s)
    print '---------------------'
    regex = re.compile(r'^FOO=(.+)(?<!\\)$', re.M)
    print regex.search(s).group(1)
    print '---------------------'
    regex = re.compile(r'^FOO=(.+)(?<!\\)$', re.M|re.DOTALL)
    print regex.search(s).group(1)

test()

示例文本中包含大量空格字符,包括反斜杠之后的空格字符。我认为这不是您的意图,因为反斜杠的目的是转义通常会标记条目结尾的换行符

但是反斜杠也可以用于转义其他字符,包括反斜杠。如果一个值恰好以反斜杠结尾,它将在makefile中显示为两个反斜杠。正则表达式中的lookback将“看到”第二个字符,并错误地将其视为行继续的一部分

如果您正在考虑添加另一个lookback以查看反斜杠是否被转义,那么现在让我阻止您。这已经被反复讨论过很多次,并且lookback方法无法发挥作用。您想要的是这样的:

regex = re.compile(r'^FOO=([^\n\\]*(?:\\.[^\n\\]*)*)$', re.M | re.S)

第一个
[^\n\\]*
使用尽可能多的非换行符、非反斜杠字符,然后将控制权交给下一部分。如果尚未到达字符串的结尾,它会尝试匹配一个反斜杠,后面跟任何字符(包括换行符,感谢
re.S
修饰符),后面跟一些“正常”字符字符。它在循环中继续,直到(假设输入有效)它运行到未转换的换行符或输入的结尾


虽然是
re.s
修饰符让点匹配换行符,但是
re.M
修饰符也是需要的;正如@stema所解释的,它让
^
匹配行的开头和
$
匹配行的结尾。

ha。这就是缺少的部分。不过,我注意到,这个regexp始终匹配从匹配开始到字符串内容结束的所有内容。理想情况下,我只想使其匹配到前一个字符不是“\”的下一个字符。我尝试(成功)了以下正则表达式:“^FOO=(.+)(?不要忘了对您发现有用的答案进行投票,如果其中任何一个解决了您的问题,请将其标记为“已接受”“!SO的全部思想是检查答案/问题,以标记哪一个对具有相同问题的程序员同事有用!”
'    \n\nFOO=a \\    \n\n  b\n\n  '
---------------------
a \    
-----
'a \\    '
---------------------
a \    

  b


-----
'a \\    \n\n  b\n\n  '
regex = re.compile(r'^FOO=([^\n\\]*(?:\\.[^\n\\]*)*)$', re.M | re.S)