regex 替换左括号和右括号中的$符号

y4ekin9u  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(123)

我在Python中有大量内联的LaTeX风格的数学字符串,例如,我正在使用MathJAX编写到网页中的eq = "$E = mc^2$"eq = "$F = ma$ (N)"。因此,我想将开始和结束的$符号转换为默认的MathJAX风格,即开始用\(,结束用\),这样我上面的两个例子就变成了eqmathjax = "\(E = mc^2\)eqmathjax = "\(F = ma\) (N)"。请注意,一个字符串实际上可能包含多个等式,每个等式都有自己的一对$符号。
我可以很容易地根据需要更换,例如:

twoeqns = "$E = mc^2$ and $F = ma$"
i = 0
repl = ["\(", "\)"]
while "$" in twoeqns:
    twoeqns = twoeqns.replace("$", repl[i % 2], 1)
    i += 1

但我确信一定有一种更简单的一行程序的方法来实现这一点,例如,使用正则表达式(我知道我可以使用上面的解决方案和一个函数,并将其用作一行程序)。有人有更简单的方法吗?

vnjpjtjt

vnjpjtjt1#

import re
twoeqns = "$E = mc^2$ and $F = ma$"

print(
  re.sub(
    r'[$](?P<content>[^$]+)[$]',
    (lambda match: f'({match.group("content")})'),
    twoeqns
  )
)

.发射:

(E = mc^2) and (F = ma)

(Take去掉空格--牺牲可读性--如果你真的坚持要“一行”的话)。

tyu7yeag

tyu7yeag2#

  • "..谁有更简单的方法?..."*

您可以使用 re.sub 方法来替换匹配的文本。

\$(.+?)\$
s = 'eq = "$E = mc^2$" or eq = "$F = ma$ (N)"'
print(re.sub(r'\$(.+?)\$', r'\(\1\)', s))

输出

eq = "\(E = mc^2\)" or eq = "\(F = ma\) (N)"

相关问题