我正在尝试使用正则表达式替换 markdown 文档中包含的乳胶中的空格。
\\;
在我使用的 md 包中,所有乳胶都包裹在
或
$
I 中想要将以下内容从
$$
更改为
"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)
# check that no of $ or $$ are even
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))
Output:
[18, 39, 60, 78]
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$$"
result = re.sub(r'(\$\$)(.*?)(\$\$)', lambda m: m.group(1) + m.group(2).replace(' ', r'\;') + m.group(3), vals)
result = re.sub(r'(\$)(.*?)(\$)', lambda m: m.group(1) + m.group(2).replace(' ', r'\;') + m.group(3), result)
print(result)
解释:
-
re.sub(r'(\$\$)(.*?)(\$\$)', lambda m: m.group(1) + m.group(2).replace(' ', r'\;') + m.group(3), vals)
: 这个正则表达式匹配$$
包裹的乳胶代码块。 -
(\$\$)
:匹配两个$
并将其捕获到组 1 中。 -
(.*?)
:非贪婪地匹配任何字符,并将其捕获到组 2 中。 -
(\$\$)
:匹配两个$
并将其捕获到组 3 中。 -
lambda m: m.group(1) + m.group(2).replace(' ', r'\;') + m.group(3)
:这个 lambda 函数将匹配到的字符串替换为组 1、组 2(其中空格被替换为\;
)和组 3 的拼接。 -
re.sub(r'(\$)(.*?)(\$)', lambda m: m.group(1) + m.group(2).replace(' ', r'\;') + m.group(3), result)
: 这个正则表达式与第一个表达式类似,但是匹配的是$
包裹的乳胶代码块。
这个代码会将
vals
字符串中所有乳胶分隔符之间的空格替换为
\;
,并将结果存储在
result
变量中。