简体   繁体   中英

Python string.replace equivalent (from Javascript)

I am trying to pick up python and as someone coming from Javascript I haven't really been able to understand python's regex package re

What I am trying to do is something I have done in javascript to build a very very simple templating "engine" (I understand AST is the way to go for anything more complex):

In javascript:

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

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

In Javascript that will result in:

"One To Rule All testing this. {{_thiswillNotMatch}} One To Rule All"

And the function will get called twice with:

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

and:

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

Now, in python I have tried looking up docs on the re package

import re

Have tried doing something along the lines of:

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

But it really doesn't make sense to me and doesn't work. For one, I'm not clear on what this group() concept means? And how am I to know if there is match.group(n)... group(n+11000)?

Thanks!

Python's re.sub function is just like JavaScript's 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)

And the result:

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

As for the groups, notice how your replacement function accepts a match argument and an innerCapture argument. The first argument is match.group(0) . The second one is match.group(1) .

I think you want to substitute all occurrences of {{prefix_*}} where * is basically anything. If so, this code works and is simple.

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

Cheers!

If you will be using the same pattern more than once (such as in a loop), then this is better:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM