python regex找到跨越多行的匹配

时间:2016-08-19 16:27:25

标签: python regex

所以我试图在python中使用正则表达式从BibTex中获取字符串。这是我的字符串的一部分:

a = '''title = {The Origin ({S},
        {Se}, and {Te})- {TiO$_2$} Photocatalysts},
   year = {2010},
   volume = {114},'''

我想获取标题的字符串,即:

The Origin ({S},
        {Se}, and {Te})- {TiO$_2$} Photocatalysts

我目前有这段代码:

pattern = re.compile('title\s*=\s*{(.*|\n?)},\s*\n', re.DOTALL|re.I)
pattern.findall(a)

但它只给了我:

['The Origin ({S},\n            {Se}, and {Te})- {TiO$_2$} Photocatalysts},\n       year = {2010']

如何在没有year信息的情况下获取整个标题字符串? 很多时候,year之后title不正确。所以我不能用:

pattern = re.compile('title\s*=\s*{(.*|\n?)},\s*\n.*year', re.DOTALL|re.I)
pattern.findall(a)

4 个答案:

答案 0 :(得分:1)

快速解决方案是修改正则表达式

pattern = re.compile('title\s*=\s*{(.*|\n?)},\s*\n', re.DOTALL|re.I)

答案 1 :(得分:1)

取决于你想要你的正则表达式的一般程度。我想你希望你的字符串能够包含{和},所以使用它来标记模式的结尾将导致问题。也可能有多个括号。

这是一个想法,如果你在正则表达式的末尾查找单词year会怎么样,假设它是常数。

bar2/doc

答案 2 :(得分:1)

使用较新的regex module

import regex as re

rx = re.compile(r'''
        (?(DEFINE)
            (?<part>\w+\ =\ \{)
            (?<end>\},)
            (?<title>title\ =\ \{)
        )
        (?&title)(?P<t>(?:(?!(?&part))[\s\S])+)(?&end)
    ''', re.VERBOSE)

string = '''
title = {The Origin ({S},
        {Se}, and {Te})- {TiO$_2$} Photocatalysts},
   year = {2010},
   volume = {114},
'''

title = rx.search(string).group('t')
print(title)
# The Origin ({S},
#    {Se}, and {Te})- {TiO$_2$} Photocatalysts

虽然不是真的需要,但它提供了另一种解决方案。

答案 3 :(得分:0)

textwrap非常有用:

<title>The Title</title>