首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将嵌套的LaTeX宏与Python中的re匹配?

如何将嵌套的LaTeX宏与Python中的re匹配?
EN

Stack Overflow用户
提问于 2022-04-06 17:43:37
回答 1查看 75关注 0票数 1

我想正确匹配LaTeX宏,甚至是嵌套宏。见以下内容:

代码语言:javascript
复制
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宏与其内容匹配。我试过以下几种方法,但没有一种是正确的:

代码语言:javascript
复制
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 }']

即使是非贪婪的版本在这种情况下也不起作用:

代码语言:javascript
复制
re.findall(r'(?:\\lr\{.*?\})', s, re.DOTALL)
['\\lr{secondline\\rl{ right-to-left\n        \\lr{nested left-to-right}',
 '\\lr{end line \n}']

我需要一些正则表达式来正确匹配它,类似于嵌套括号,这里我为LaTeX宏设置了嵌套的花括号。

编辑:

我想得到以下的匹配:

代码语言:javascript
复制
['\\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}']

如果我知道嵌套的级别,如下所示,那就太好了:

代码语言:javascript
复制
[('\\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)]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-06 18:18:14

使用PyPi regex模块(在用pip install regex安装它之后),您可以使用

代码语言:javascript
复制
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}']

请参阅Python演示regex演示

还请注意与overlapped=True一起使用的允许匹配嵌套事件的regex.finditer选项。

详细信息

  • \\lr - \lr字符串
  • (\{(?:[^{}]++|(?1))*}) -第1组(定义为递归时引用):
    • \{ -a { char
    • (?:[^{}]++|(?1))* -零或更多次重复
    • [^{}]++ -除了{}之外,还有一个或多个字符,没有可能再次匹配文本,以防触发回溯(即它是拥有地匹配的)。
    • | -或
    • (?1) -第1组模式递归
    • } -a } char.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71771411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档