python regexp不匹配序列
我需要用HTML标记包装一些MathJax字符串。我想知道如何从搜索字符串中排除python regexp不匹配序列,python,regex,Python,Regex,我需要用HTML标记包装一些MathJax字符串。我想知道如何从搜索字符串中排除\),使其不匹配完整的sting。使用单字符很容易,例如[^)],但是当我需要使用相同的字符时,该怎么做,例如,两个字符一个接一个\) search\u str=“\(\ce{\sigma{s}{b}(H2O)}\)bla bla\(\ce{\sigma{s}{b}(H2O)}\) out=re.sub(r'(\\\([^\\\)]+\\\)','\1',search\u str) 我认为[^\\][^)]应该起作用
\)
,使其不匹配完整的sting。使用单字符很容易,例如[^)]
,但是当我需要使用相同的字符时,该怎么做,例如,两个字符一个接一个\)
search\u str=“\(\ce{\sigma{s}{b}(H2O)}\)bla bla\(\ce{\sigma{s}{b}(H2O)}\)
out=re.sub(r'(\\\([^\\\)]+\\\)','\1',search\u str)
我认为[^\\][^)]
应该起作用,或者。差不多。只要第一个字符不是斜杠,第二个字符不是结束符,就可以匹配任意两个字符。如果这不是你想要的,你也可以尝试一些分组 感谢塞巴斯蒂安的推荐,我使用了一种贪婪的代币:
(\\\((?:(?!\\\)).)*\\\)
简直太棒了:-)您正在尝试匹配任何文本,但
\)
2字符子字符串,2字符字符序列,与[^\\)]+
,这是错误的,因为[^…]
是一个可以匹配属于类中定义的特定字符范围或字符集的单个字符的。它永远无法匹配字符组合,*
或+
量词只是重复单个字符匹配
你所想到的被称为,(?:(?!\\))*
或(?:(?!\\))*?
然而,在这种情况下,这种方法并不是最佳做法。请参阅rexegg.com关于何时不使用TGT的说明:
对于手头的任务,此技术与惰性点星*?{END}
相比没有优势。尽管它们的逻辑不同,但在匹配字符之前的每一步,这两种技术都会强制引擎查看下面的内容是否为{END}
这两个版本的比较性能将取决于引擎的内部优化。该实用程序表明,对于懒惰的点星型版本,PCRE需要的步骤要少得多。在我的笔记本电脑上,当对字符串{START}Mary{END}
运行这两个表达式一百万次时,对于惰性版本,pcretest每10000次运行需要400毫秒,对于回火版本,需要800毫秒
因此,如果调整点的字符串是我们打算最终匹配的定界符(如我们的示例中的{END}
),则此技术不会向惰性点星添加任何内容,而惰性点星更适合此作业
您的字符串似乎格式良好且很短,只需使用惰性点匹配模式,即,\\\\(.*?\\\)
regex
此外,您需要在替换模式定义中使用r
前缀,即原始字符串文字,否则\1
将被解析为十六进制字符(\x01
,头的开头)
重新导入
搜索“\(\ce{\sigma{s}^{b}(H2O)}\)bla bla\(\ce{\sigma{s}^{b}(H2O)}\)”
打印(搜索)
out=re.sub(r'(\\\(.*?\\\)',r'\1',search\u str)
打印(输出)
请参阅惰性匹配(+?
)应该足够了,a可能更好。这两种方法对嵌套括号都没有帮助。
(\\\((?:(?!\\\)).)*\\\)
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)