要匹配的字串:
{abc}
不匹配的字串:
$${abc{abc}{abc}}$$
如何使用正則運算式滿足此要求?
背景關系正在嘗試匹配{abc}要替換為 Python 的元素,但我不希望它們與檔案$${abc{abc}{abc}}$$中的MathJax 方程混淆HTML。
我知道[^$]{. }對于"$${}$$"諸如"$${{abc}}$$". 不應該匹配。
樣本:
Match:
{element 1}
{element 2}
{element_abc}
Don't match:
$${abc{abc}{abc}}$$
$${mathjax{}{mathjax}}$$
$${mathjax{}{}{}{}{{{mathjax}}}}$$
與以下比賽:
{element 1}{element 2}{element_abc}
搜索不需要遞回掃描混合元素:
{$${}$$}可以匹配(在我的實際文本中不可能,所以如果需要可以進行匹配)- 一行 a
{abc}和 a$${abc}$$這樣的{abc} abc $${abc}$$可能是可能的
使用regex 2021.11.10通過pip
uj5u.com熱心網友回復:
使用 PyPi 正則運算式庫,您可以使用基于 SKIP-FAIL 遞回的正則運算式,例如
\$\$({(?:[^{}] |(?1))*})\$\$(*SKIP)(*F)|{([^{}]*)}
請參閱正則運算式演示。詳情:
\$\$({(?:[^{}] |(?1))*})\$\$(*SKIP)(*F):\$\$- 一個$$字串({(?:[^{}] |(?1))*})- 第 1 組: a ,然后遞回出現除和/或相同的第 1 組模式{之外的任何一個或多個字符的任何零次或多次出現,然后{}}}\$\$- 一個$$字串(*SKIP)(*F)- “忘記”匹配到這一刻的文本
|- 或者{([^{}]*)}- ,然后第 2 組捕獲除and之外的{任何零個或多個字符,然后是 a 。{}}
在 Python 中,您可以使用
import regex
text = '{element 1} {element 2} {element_abc} $${abc{abc}{abc}}$$ $${mathjax{}{mathjax}}$$ $${mathjax{}{}{}{}{{{mathjax}}}}$$'
pattern = regex.compile( r'\$\$({(?:[^{}] |(?1))*})\$\$(*SKIP)(*F)|{([^{}]*)}' )
print( [match.group() for match in pattern.finditer(text)] )
# => ['{element 1}', '{element 2}', '{element_abc}']
print( [match.group(2) for match in pattern.finditer(text)] )
# => ['element 1', 'element 2', 'element_abc']
請參閱此在線演示。
uj5u.com熱心網友回復:
如果您只需要匹配單個行上的運算式,您只需要添加行錨。
^\{[^{}] \}$
如果您的輸入是一個包含多行的單個字串,您需要添加re.MULTILINE標志來說明這一點,^并且也$應該在內部換行符處匹配。
>>> import re
>>> re.findall(r'^\{[^{}] \}$', '''
... {foo}
... $${bar{baz}}
... {quux}
... ick
... ''', re.MULTILINE)
['{foo}', '{quux}']
這也可以移植回標準 Pythonre模塊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/420679.html
標籤:
