5

我正在尝试学习 python,作为来自 Javascript 的人,我还没有真正理解 python 的正则表达式包 re

我正在尝试做的是我在 javascript 中所做的事情,以构建一个非常简单的模板“引擎”(我知道 AST 是解决任何更复杂的事情的方法):

在 JavaScript 中:

var rawString = 
  "{{prefix_HelloWorld}}   testing this. {{_thiswillNotMatch}} \ 
  {{prefix_Okay}}";

rawString.replace(
   /\{\{prefix_(.+?)\}\}/g,
   function(match, innerCapture){
     return "One To Rule All";
});

在 Javascript 中,这将导致:

“一个统治所有测试这个。{{_thiswillNotMatch}}一个统治所有”

该函数将被调用两次:

   innerCapture === "HelloWorld"
   match ==== "{{prefix_HelloWorld}}"

和:

   innerCapture === "Okay"
   match ==== "{{prefix_Okay}}"

现在,在 python 中,我尝试在 re 包上查找文档

import re

尝试按照以下方式做一些事情:

match = re.search(r'pattern', string)
if match:
  print match.group()
  print match.group(1)

但这对我来说真的没有意义,也不起作用。一方面,我不清楚这个 group() 概念是什么意思?我怎么知道是否有 match.group(n)... group(n+11000)?

谢谢!

4

3 回答 3

5

Python 的re.sub功能就像 JavaScript 的一样String.prototype.replace

import re

def replacer(match):
    return match.group(1).upper()

rawString = "{{prefix_HelloWorld}}   testing this. {{_thiswillNotMatch}} {{prefix_Okay}}"
result = re.sub(r'\{\{prefix_(.+?)\}\}', replacer, rawString)

结果:

'HELLOWORLD   testing this. {{_thiswillNotMatch}} OKAY'

至于组,请注意您的替换函数如何接受match参数和innerCapture参数。第一个论点是match.group(0)。第二个是match.group(1)

于 2013-07-31T07:57:59.190 回答
0

我认为您想替换所有出现的 {{prefix_*}} ,其中 * 基本上是任何东西。如果是这样,则此代码有效并且很简单。

 pattern = "\{\{prefix_.*?\}\}"
 re.sub(pattern, "One To Rule All", rawString)

干杯!

于 2013-07-31T08:33:57.690 回答
0

如果您将多次使用相同的模式(例如在循环中),那么这会更好:

pattern = re.compile("\{\{prefix_.*?\}\}")
# ... later ...
pattern.sub("One To Rule All", rawString)
于 2014-08-13T03:49:30.363 回答