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

Python 将保留字符与正则表达式匹配,python,regex,latex,Python,Regex,Latex,我有一个HTML-to-LaTeX解析器,它是根据它应该做的事情定制的(将HTML片段转换为LaTeX片段),但是在填充变量时有一个小问题。问题是,应该允许变量包含LaTeX保留字符(即$%^&{}~\)。这些东西需要逃走,这样它们就不会杀死我们的乳胶渲染器 处理转换和所有内容的程序都是用Python编写的,所以我试图找到一个好的解决方案。我的第一个想法是简单地执行一个.replace(),但是replace不允许您仅在第一个不是\时才进行匹配。我的第二次尝试是使用正则表达式,但我在这方面惨败

我有一个HTML-to-LaTeX解析器,它是根据它应该做的事情定制的(将HTML片段转换为LaTeX片段),但是在填充变量时有一个小问题。问题是,应该允许变量包含LaTeX保留字符(即
$%^&{}~\
)。这些东西需要逃走,这样它们就不会杀死我们的乳胶渲染器

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

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

有人能帮我处理这个正则表达式吗


编辑哎呀,我好像也包括了斜杠。显示了当我发布这条消息时我是多么清醒:)在我的情况下,它们不应该被转义,但从答案中的正则表达式中删除它们相对容易。谢谢大家

这个
[^\]
是一个字符类,用于表示任何不是
\
的字符,这就是它匹配所有字符的原因。您需要一个否定的lookbehind断言:

((?<!\)[#\$%\^&_\{\}~\\])
(?
(?将匹配它后面的任何内容,只要它前面没有
。您可以在中查看此项。正则表达式
([^\][\$%\^&
匹配第一个
[
和最后一个
]之间未找到的任何内容
,因此它应该匹配除您希望它匹配的内容之外的所有内容

在括号中移动应该会修复原始正则表达式
([^\])[\$%\^&


我会尝试使用正则表达式,它与您要转义的字符之前的字符不匹配。我不是正则表达式专家,因此可能有更好的模式,但如果您希望查找未转义的特殊字符,而不消除转义反斜杠之前的特殊字符,则这应该可以工作(例如,您确实想匹配
abc\\\def
中的最后一个反斜杠),请尝试以下操作:

(?<!\\)(\\\\)*[#\$%\^&_\{\}~\\]
(?
这将匹配前面有偶数(包括0)反斜杠的任何特殊字符。它表示该字符前面可以有任意数量的反斜杠对,后面有一个负数,表示这些反斜杠前面不能有另一个反斜杠


匹配将包括反斜杠,但如果您在所有反斜杠前面粘贴另一个反斜杠,无论如何都会达到转义特殊字符的相同效果。

您希望匹配一个反斜杠,而不是两个,对吗?三个如何?即使前面有另一个反斜杠,您仍然希望匹配最后一个反斜杠吗?请注意在TeX中没有“保留字符”这样的东西。您发布的列表是一种任意约定,可以在任何时候(也可以多次)重新定义在文档中。如果不解析文档,就无法替换LaTeX中的一般特殊字符。但不要因此而影响您,因为出于您的目的,您提到的字符可能很好。出于我们的目的,只有非转义或转义版本。我们正在创建一个(非常)HTML中LaTeX的有限子集。这也是为什么这个列表对我们来说应该足够好的原因。我甚至可以说,我现在真正需要转义的是下划线,但最好是安全的:)请注意,这不考虑转义反斜杠。也就是说,<代码> >代码< >代码> >代码>实际上应该是匹配的,但是它不会与此模式相关联。@ B.Butnter不幸的是,没有办法检查RexEx是否有前面的反斜杠被跳过或没有,因为Python只允许查找字符串中的固定长度字符串。@米歇尔不在A中。直截了当的方法,没有,但有一些技巧可以做到。这似乎工作得几乎完美,但我似乎在我的原始问题中犯了一个小错误。反斜杠不应该被逃避,但这很容易通过从regexp中删除最后一个反斜杠来修复。这似乎是最好的解决方案,谢谢!@Xudonax I-edited没有转义反斜杠的答案。这也不考虑转义反斜杠(请参阅我对SethMMorton答案的评论)。不幸的是,当我通过
re.findall
运行它时,只会给出空结果。当我稍微将其修改为
(?它确实匹配,但也包括两个反斜杠。不幸的是,所有其他的都是这样。