使用负前瞻/后面断言
pattern = re.compile("(?<!\{)\{(?!\{).*?(?<!\})\}(?!\})")
pattern.sub("hello", input_string)
负前瞻/后面断言允许您比较多的字符串,但不被视为使用了字符串的一部分的比赛。在断言之前还有一个正常的查看,只有当字符串IS在给定模式后面/之前时,才会使字符串匹配。
这是混淆找了一下,在这里它是在片:
"(?<!\{)" #Not preceded by a {
"\{" #A {
"(?!\{)" #Not followed by a {
".*?" #Any character(s) (non-greedy)
"(?<!\})" #Not preceded by a } (in reference to the next character)
"\}" #A }
"(?!\})" #Not followed by a }
所以,我们正在寻找一个{周围没有任何其他{的,其次是一些字符,然后是}没有任何其他的}围绕它。
通过使用负前视/后置断言,我们将其压缩为单个正则表达式,该表达式将成功匹配字符串中任何位置的单个{}。
另外,请注意*是一个贪婪的运算符。它将尽可能匹配。如果您使用"\{.*\}"
,并且文本中有多个{}块,则它们之间的所有内容都将与其一起进行处理。
“这是一些示例文本{块1}更多文本,看着我消失{块2}甚至更多的文本”
成为
“这是一些示例文本你好甚至更多而不是文字”
“这是一些示例文本你好更多文本,看着我消失你好甚至更多的文本”
要得到我们需要使其非贪婪通过附加一个适当的输出?
python文档在呈现re库方面做得很好,但真正学习的唯一方法是进行实验。
你能给我一个如何在Python中做到这一点的例子吗?我不太清楚我的理解。谢谢! – So8res 2009-05-20 16:56:55
我可以在大约一个小时内,但不是现在,对不起... – 2009-05-20 16:58:45