I’m trying to get re.sub to replace a pattern specified with a value for example
for lines in f:
pattern='${2}'+key[0]+'${2}'
re.search(pattern,lines)
this return the line where the pattern was found. For example this is one of the test returns if got
this is a $$test$$
The problem i’m having is when i do the following
re.sub(pattern,key[1],lines)
nothing happens. What am i missing? For more info key[0]=test and key[1]=replace
so what i’m trying to do is whenever “$$test$$” is encountered it will replace it with “replace”. I have no problem finding “$$test$$” but for some reason re.sub isn’t replacing it.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
You are assigning the result of re.sub back to a variable, right? e.g.
lines = re.sub(pattern, key[1], lines)
It’s a string, so it can’t be changed (strings are immutable in Python), therefore a new string is created and returned to you. If you don’t assign it back to a name, you will lose it.
Method 2
If you have a text, you can run re.sub() directly on the whole text as follows:
import re
ss = '''that's a line
another line
a line to $$test$$
123456
here $$test$$ again
closing line'''
print(ss,'n')
key = {0:'test', 1:'replace'}
regx = re.compile('$${[0]}$$'.format(key))
print( regx.sub(key[1],ss) )
.
If you read a file, you should have interest to read the whole file and put it in an object ss before runing re.sub() on it, instead of reading and replacing line after line
.
And if you have a list of lines , you must process as follows:
import re
key = {0:'test', 1:'replace'}
regx = re.compile('$${[0]}$$'.format(key))
lines = ["that's a line",
'another line',
'a line to $$test$$',
'123456',
'here $$test$$ again',
'closing line']
for i,line in enumerate(lines):
lines[i] = regx.sub(key[1],line)
Otherwise a line containing ‘$$test$$’ wouldn’t be modified:
import re
key = {0:'test', 1:'replace'}
regx = re.compile('$${[0]}$$'.format(key))
lines = ["that's a line",
'another line',
'a line to $$test$$',
'123456',
'here $$test$$ again',
'closing line']
for line in lines:
line = regx.sub(key[1],line)
print (lines)
result
["that's a line", 'another line', 'a line to $$test$$', '123456', 'here $$test$$ again', 'closing line']
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0