如何使用正则表达式替换Markdown中LaTeX块内的空格为\;
问题:替换Markdown中LaTeX代码内的空格为
\; 需求说明
需要用正则表达式简化实现:将Markdown文档里被$或$$包裹的LaTeX代码中的空格替换为\;。
原文本示例
"dont edit this $result= \frac{1}{4}$ dont edit this $$some result=123$$"
期望转换结果
"dont edit this $result=\\;\frac{1}{4}$ dont edit this $$some\\;result=123$$"
现有繁琐实现
用户已通过复杂函数实现需求,代码如下:
import re vals = r"dont edit this $result= \frac{1}{4}$ dont edit this $$some result=123$$" def cleanlatex(vals): vals = vals.replace(" ", " ") char1 = r"\$\$" char2 = r"\$" indices = [i.start() for i in re.finditer(char1, vals)] indices += [i.start() for i in re.finditer(char2, vals.replace("$$","~~"))] indices.sort() print(indices) # 检查$或$$的数量是否为偶数 if len(indices) % 2 == 0: while indices: start = indices.pop(0) finish = indices.pop(0) vals = vals[:start] + vals[start:finish].replace(' ', '\;') + vals[finish:] vals = vals.replace(" ", " ") return vals print(cleanlatex(vals))
现有代码输出
[18, 39, 60, 78] dont edit this $result=\\;\frac{1}{4}$ dont edit this $$some\\;result=123$$
简洁正则方案
利用re.sub()配合回调函数,可一次性处理所有LaTeX块:
import re def replace_latex_spaces(text): def replacer(match): # 对匹配到的LaTeX块替换空格为\; return match.group(0).replace(" ", r"\;") # 正则优先匹配$$包裹的内容,再匹配单个$包裹的内容(避免和$$冲突) pattern = re.compile(r'\$\$(.*?)\$\$|\$(?!\$)(.*?)\$(?!\$)', re.DOTALL) return pattern.sub(replacer, text) # 测试 vals = r"dont edit this $result= \frac{1}{4}$ dont edit this $$some result=123$$" print(replace_latex_spaces(vals))
方案说明
- 正则表达式逻辑:
\$\$(.*?)\$\$:匹配$$包裹的LaTeX内容,非贪婪模式防止跨块匹配\$(?!\$)(.*?)\$(?!\$):匹配单个$包裹的内容,(?!\$)负向断言确保前后不是第二个$,避免和$$场景冲突
re.DOTALL参数:让.匹配换行符,支持多行LaTeX块- 回调函数
replacer:对每个匹配到的LaTeX块执行空格替换操作
运行结果
"dont edit this $result=\\;\frac{1}{4}$ dont edit this $$some\\;result=123$$"
内容的提问来源于stack exchange,提问作者Dara O h
相关产品推荐
相关产品推荐

