繁体   English   中英

仅使用正则表达式替换特定字符之间的空格

[英]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 但仍然对以下内容感到困惑

  1. 有理由使用 ($$?) 而不是 ($+) 吗?
  2. \1 -> 这只是保持模式整洁的一种方式,如果我使用 \2 它将复制第二个捕获组?
  3. 是吗? in (.*?) 让它找到匹配模式的最短字符串?
  4. 为什么 m[0] 即为什么索引为 0

再次感谢你的回复

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM