[英]Replace spaces between specific characters only using regex
我正在尝试用\\;
使用正则表达式。
在我正在使用的 md package 中,所有 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$$"
我已经设法使用下面凌乱的 function 来做到这一点,但我想使用正则表达式来获得更清洁的方法。 任何帮助,将不胜感激
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$$
使用正则表达式,我仍然会分两步完成:
replace
调用替换空格def cleanlatex(vals):
return re.sub(r"(\$\$?)(.*?)\1", lambda m: m[0].replace(" ", r"\;"), vals)
如果美元不匹配,这仍然会进行替换,直到找不到更多匹配的美元。 这是与您的代码工作方式不同的行为,在美元不匹配时不会替换任何内容。
当美元被“嵌套”时,比如在“$$nested $ here$$”中,那么在这个解决方案中,内部的美元将不会被视为分隔符。 或者,如果双美元恰好跟在单美元之后,则双美元将被解释为恰好彼此跟随的两个单美元。 所以“$part one$$part two$”将标识两个部分,每个部分用一个美元分隔。
您的问题没有给出任何这样的边界条件(其中有很多),因此解决方案可能需要一些调整。
我从没想过lambda。 谢谢@trincot,您的回答涵盖了我什至不知道使用正则表达式可能实现的事情? 我正在尝试破译这种模式,如果可以的话,我希望得到一些澄清? 我真的很感激,因为我已经看过 re docs 但仍然对以下内容感到困惑
再次感谢你的回复
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.