将LaTeX保留字符与正则表达式匹配

时间:2013-08-21 15:02:26

标签: python regex latex

我有一个HTML到LaTeX解析器,它根据它应该做的事情(将HTML片段转换成LaTeX的片段),但填充变量有一点问题。问题是变量应该允许包含LaTeX保留字符(即# $ % ^ & _ { } ~ \)。这些都需要进行转义,以免它们杀死我们的LaTeX渲染器。

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

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

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

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

3 个答案:

答案 0 :(得分:4)

[^\]是任何不是\的字符类,这就是它匹配所有内容的原因。你想要一个负面的后瞻性断言:

((?<!\)[#\$%\^&_\{\}~\\])
只要(?<!...)不在其前面,

...就会匹配其后的内容。您可以在python docs

上查看

答案 1 :(得分:1)

正则表达式([^\][#\$%\^&_\{\}~\\])匹配在第一个[和最后一个]之间找不到的任何内容,因此它应匹配除了您想要的内容之外的所有内容。< / p>

在括号内移动应修复原始正则表达式([^\\])[#\$%\^&_\{\}~\\]

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

答案 2 :(得分:1)

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

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

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

匹配将包括反斜杠,但是如果你在所有这些游戏中粘贴另一个,那么无论如何它都会达到逃避特殊字符的效果。