5

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!

3 Answers 3

6

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).

Sign up to request clarification or add additional context in comments.

2 Comments

Thank you that makes a lot of sense. What would group 2, 3, etc be? Or are those not defined.
@JohnTomson: .group(n) is the nth capturing group.
0

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!

Comments

0

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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.