python正则表达式查找跨越多行的匹配项

2024-10-03 19:30:25 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我尝试在python中使用regex从BibTex获取字符串。这是我的一部分绳子:

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

我想抓住标题的字符串,那就是:

^{pr2}$

我现在有这个代码:

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)

Tags: andthe字符串re标题titleoriginyear
3条回答

取决于你希望你的正则表达式有多普遍。我想您希望您的字符串能够包含{和},因此使用它来标记模式的结尾将导致问题。也可能有多个括号。在

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

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

使用较新的^{}

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

虽然它不是真正需要的,但它提供了一个替代的解决方案。在

一个快速的解决方案是修改regex模式

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

相关问题 更多 >