我需要用HTML标签包装一些MathJax字符串。我想知道如何从搜索字符串中排除\)
以不匹配完整的sting。使用单个字符很容易,例如[^)]
,但是当我需要对例如{1}进行相同操作时该怎么做两个字符一个接一个\)
?
search_str = "\(\ce{\sigma_{s}^{b}(H2O)}\) bla bla \(\ce{\sigma_{s}^{b}(H2O)}\)"
out = re.sub(r'(\\\([^\\\)]+\\\))', '<span>\1</span>', search_str)
答案 0 :(得分:0)
我认为[^\\][^)]
可以做到这一点,或者。几乎如此。只要第一个不是斜线,那将匹配任何两个字符,第二个不是结束paren。你也可以尝试一些分组,如果这不是你想要的那样。
答案 1 :(得分:0)
感谢塞巴斯蒂安的推荐,我使用了Tempered Greedy Token:
(\\\((?:(?!\\\)).)*\\\)
简直太棒了: - )
答案 2 :(得分:0)
在这种情况下,tempered greedy token不是最佳做法。有关使用TGT的不的信息,请参阅rexegg.com说明:
对于手头的任务,这种技术没有优于懒惰的点星
.*?{END}
。虽然它们的逻辑不同,但在每一步中,在匹配一个角色之前,两种技术都会强制引擎查看后面的内容是{END}
。这两个版本的比较性能取决于您的引擎的内部优化。 pcretest实用程序表明PCRE对懒惰点星版本的步骤要少得多。在我的笔记本电脑上,当对字符串
{START} Mary {END}
运行两个表达式一百万次时,pcretest对于懒惰版本每10,000次运行需要400毫秒,对于缓和版本需要800毫秒。因此,如果调整点的字符串是我们打算最终匹配的分隔符(在我们的例子中与
{END}
一样),这种技术不会给懒惰的点星增加任何内容,这对于这个工作。
您的字符串似乎格式正确且相当短,只使用懒字点匹配模式,即\\\(.*?\\\)
正则表达式。
此外,您需要在替换模式定义中使用r
前缀(原始字符串文字),或者\1
将被解析为十六进制字符\x01
,标题的开头)。
import re
search_str = r"\(\ce{\sigma_{s}^{b}(H2O)}\) bla bla \(\ce{\sigma_{s}^{b}(H2O)}\)"
print(search_str)
out = re.sub(r'(\\\(.*?\\\))', r'<span>\1</span>', search_str)
print(out)
请参阅Python demo