我想正確匹配 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)]
uj5u.com熱心網友回復:
使用 PyPi 正則運算式模塊(使用 安裝它之后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}']
請參閱Python 演示和正則運算式演示。
另請注意與允許匹配嵌套事件overlapped=True一起使用的選項。regex.finditer
詳情:
\\lr-\lr字串(\{(?:[^{}] |(?1))*})- 第 1 組(定義為在遞回時參考):\{- 一個{字符(?:[^{}] |(?1))*- 零次或多次重復[^{}]-在觸發回溯的情況下(即所有格匹配),一個或多個字符除了{并且沒有可能再次重新匹配文本之外}|- 要么(?1)- 組 1 模式遞回}- 一個}字符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/457095.html
