python regexp不匹配序列

时间:2016-12-08 14:23:12

标签: python regex

我需要用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)

3 个答案:

答案 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