3

我有一个 HTML 到 LaTeX 解析器,它针对它应该做的事情(将 HTML 片段转换为 LaTeX 片段)进行了定制,但是在填充变量时存在一个小问题。问题是应该允许变量包含 LaTeX 保留字符(即# $ % ^ & _ { } ~ \)。这些需要被转义,这样它们就不会杀死我们的 LaTeX 渲染器。

处理转换和一切的程序都是用 Python 编写的,所以我试图找到一个不错的解决方案。我的第一个想法是简单地做 a .replace(),但 replace 仅当第一个不是 a 时才允许您匹配\。我的第二次尝试是一个正则表达式,但我失败了。

我想出的正则表达式是([^\][#\$%\^&_\{\}~\\]). \我希望这将匹配任何保留字符,但前提是它前面没有 a 。不幸的是,这匹配了我输入文本中的任何单个字符。我也尝试过这个正则表达式的不同变体,但我无法让它工作。变化主要包括在正则表达式的第二部分中删除/添加斜杠。

任何人都可以帮助这个正则表达式吗?

编辑哎呀,我似乎也包括了斜线。显示当我发布此内容时我有多清醒 :) 在我的情况下它们不应该被转义,但是从答案中的正则表达式中删除它们相对容易。谢谢大家!

4

3 回答 3

4

The[^\]是任何不是 a 的字符类\,这就是它匹配所有内容的原因。你想要一个否定的后向断言:

((?<!\)[#\$%\^&_\{\}~\\])

(?<!...)只要...不在它前面,它就会匹配它后面的任何东西。您可以在python 文档中查看这一点

于 2013-08-21T15:12:38.947 回答
1

正则表达式匹配 first和 last([^\][#\$%\^&_\{\}~\\])之间未找到的任何内容,因此它应该匹配除您想要的内容之外的所有内容。[]

移动括号应该可以修复您原来的 regex ([^\\])[#\$%\^&_\{\}~\\]

我会尝试使用正则表达式lookbehinds,它与您要转义的字符之前的字符不匹配。我不是正则表达式专家,所以也许有更好的模式,但这应该可以(?<!\\)[#\$%\^&_\{\}~\\]

于 2013-08-21T15:18:42.663 回答
1

如果您要查找未转义的特殊字符,而不消除转义反斜杠前面的特殊字符(例如,您确实想匹配 中的最后一个反斜杠abc\\\def),请尝试以下操作:

(?<!\\)(\\\\)*[#\$%\^&_\{\}~\\]

这将匹配前面带有偶数(包括 0)反斜杠的任何特殊字符。它说字符前面可以有任意数量的反斜杠对,后面的否定表示这些反斜杠前面不能有另一个反斜杠。

匹配将包括反斜杠,但如果你在所有反斜杠前面加上另一个,无论如何它都会达到逃避特殊字符的相同效果。

于 2013-08-21T15:50:46.067 回答