我想正确匹配LaTeX宏,甚至是嵌套宏。见以下内容:
s = r'''
firstline
\lr{secondline\rl{ right-to-left
\lr{nested left-to-right} end RTL }
other text
}
\rl{ last \lr{end line
} end RTL }
'''例如,在上面,我希望将\lr宏与其内容匹配。我试过以下几种方法,但没有一种是正确的:
re.findall(r'(?:\\lr\{.*\})', s, re.DOTALL)
['\\lr{secondline\\rl{ right-to-left\n \\lr{nested left-to-right} end RTL }\n other text\n}\n\\rl{ last \\lr{end line \n} end RTL }']即使是非贪婪的版本在这种情况下也不起作用:
re.findall(r'(?:\\lr\{.*?\})', s, re.DOTALL)
['\\lr{secondline\\rl{ right-to-left\n \\lr{nested left-to-right}',
'\\lr{end line \n}']我需要一些正则表达式来正确匹配它,类似于嵌套括号,这里我为LaTeX宏设置了嵌套的花括号。
编辑:
我想得到以下的匹配:
['\\lr{secondline\\rl{ right-to-left\n \\lr{nested left-to-right} end RTL }\n other text\n}',
'\\lr{nested left-to-right}',
'\\lr{end line \n}']如果我知道嵌套的级别,如下所示,那就太好了:
[('\\lr{secondline\\rl{ right-to-left\n \\lr{nested left-to-right} end RTL }\n other text\n}',1)
('\\lr{nested left-to-right}',2)
('\\lr{end line \n}',1)]发布于 2022-04-06 18:18:14
使用PyPi regex模块(在用pip install regex安装它之后),您可以使用
import regex
s = r'''
firstline
\lr{secondline\rl{ right-to-left
\lr{nested left-to-right} end RTL }
other text
}
\rl{ last \lr{end line
} end RTL }
'''
print( [x.group() for x in regex.finditer(r'\\lr(\{(?:[^{}]++|(?1))*})', s, overlapped=True)] )
# => ['\\lr{secondline\\rl{ right-to-left\n \\lr{nested left-to-right} end RTL }\n other text\n}', '\\lr{nested left-to-right}', '\\lr{end line \n}']还请注意与overlapped=True一起使用的允许匹配嵌套事件的regex.finditer选项。
详细信息
\\lr - \lr字符串(\{(?:[^{}]++|(?1))*}) -第1组(定义为递归时引用):\{ -a { char(?:[^{}]++|(?1))* -零或更多次重复[^{}]++ -除了{和}之外,还有一个或多个字符,没有可能再次匹配文本,以防触发回溯(即它是拥有地匹配的)。| -或(?1) -第1组模式递归} -a } char.https://stackoverflow.com/questions/71771411
复制相似问题