Jmm86
Jmm86

Reputation: 103

Using python's re.sub regular expressions to replace strings

I want to find and replace the following code snippet in java code.

::[Node1]N81:157-->::[Node1]N81[157]
::[Node1]B81:72/0-->::[Node1]B81[72].0

157 and 72 and 0 could be dynamic so maybe could have other values.

I have some pattern to find my expression but I don't know if I could improve it. Anyway, I don't know how to replace I only know the way to find the pattern as follows:

re.sub("::\[Node1]N[0-9]+:[0-9]+",'here I should put how to replace' , s)       
re.sub("::\[Node1]B[0-9]+:[0-9]+/[0-9]+",'here I should put how to replace' , s)

Upvotes: 3

Views: 560

Answers (3)

Ganesh Tata
Ganesh Tata

Reputation: 1195

You can use backreferences to solve your problem. Here is how your problem can be solved using re.sub -

In [1]: a = '::[Node1]N81:157'

In [2]: re.sub('::\[Node1\]N81:(?P<br1>[0-9]+)', '::[Node1]N81:[\g<br1>]', a)
Out[2]: '::[Node1]N81:[157]'


In [3]: b = '::[Node1]B81:72/0'

In [4]: re.sub('::\[Node1\]B81:(?P<br1>[0-9]+)/(?P<br2>[0-9]+)', '::[Node1]B81[\g<br1>].\g<br2>', b)
Out[4]: '::[Node1]B81[72].0'

(?P<br1>[0-9]+) - This tags the given group (in parenthesis) as br1.

\g<br1> - This helps to refer back to the br1 group, using its name.

For more info regarding the syntax, you can refer to the official docs - re.sub.

Upvotes: 1

Veltzer Doron
Veltzer Doron

Reputation: 974

some points:

  1. I like to escape both '[' and ']'
  2. Use /d instead of [0-9]
  3. I also like to be as specific as possible so {m,n} to be length specific
  4. Finally, have a look at this for group substitutions

In short, try the following code:

print(re.sub("(::\[Node1\]N\d{2}):(\d{2,3})", "\g<1>[\g<2>]", s))
print(re.sub("(::\[Node1\]B\d{2}):(\d{2,3})/(\d{1})", "\g<1>[\g<2>].\g<3>", s))

Upvotes: 1

L3viathan
L3viathan

Reputation: 27273

Use a capturing group:

>>> re.sub(r'::\[Node1]B(\d+):(\d+)/(\d+)', r'::[Node1]B\1[\2].\3', s)
'::[Node1]B81[72].0'

Upvotes: 1

Related Questions