I am trying to replace certain values using regex
in a binomial expression to replace the values equivalent to a determined constant x
that has as exponent the numbers 1
and 0
, example: binomial = "625x^4 1500x^3 1350x^2 540x^1 81x^0"
.
This is the pattern i am using: r'[a-z][^][0]'
but it is not returning the desired value "625x^4 1500x^3 1350x^2 540 81"
.
What pattern should I use to replace 'x^1'
and 'x^0'
with an empty or null character like ''
?
CodePudding user response:
You can use this regex:
x\^([01])\b
which will match x^
followed by 0
or 1
, and replace using a replacer function that will return x
if the exponent is 1
, otherwise nothing:
binomial = "625x^4 1500x^3 1350x^2 540x^1 81x^0"
res = re.sub(r'x\^([01])\b', lambda m:'x' if m.group(1) == '1' else '', binomial)
Output:
625x^4 1500x^3 1350x^2 540x 81
CodePudding user response:
I assume you actually want to keep the x in x^1 therefore we can use this expression with a lookbehind assertion which will not be part of the match.
binomial = "625x^4 1500x^3 1350x^2 540x^1 81x^0"
print(re.sub(r"([a-z]\^0)|(?<=[a-z])\^1\b", "", binomial))
# Output
625x^4 1500x^3 1350x^2 540x 81
[^...]
is a not in
... expression ^ needs to be escaped.
CodePudding user response:
In regular expressions, ^
is a special character which matches either the start of the line or it can be used to exclude a group. If you want to match a literal ^
character you will need to escape it with a \
. Additionally, \
is a special character in python strings so you need to either add 'r' to the start or use \\
.
This should work (run the code snippet to demo the Python):
<script src="https://modularizer.github.io/pyprez/pyprez.js" mode="editor">
import re
binomial = "625x^4 1500x^3 1350x^2 540x^1 81x^0"
pattern = r'[a-z]\^[01]'
s = re.sub(pattern, "", binomial)
print(f"{s=}")
</script>
p.s. It is unclear from the question whether you want to do math to evaluate the string or not. If you do that will require a more complex regular expression with a replacer function. I would go through a tutorial and play around with regular expressions here
<script src="https://modularizer.github.io/pyprez/pyprez.js" mode="editor">
import re
binomial = "625x^4 1500x^3 1350x^2 540x^1 81x^0"
pattern = r'([a-z])\^(\d*)'
x = 2
scope = locals()
def replacer(match):
var_name, pow = match.groups()
pow = int(pow)
r = eval(f"{var_name}**{pow}", scope)
print(f"{var_name} ** {pow} = {r}")
return f'*{r}'
s = re.sub(pattern, replacer, binomial)
s
</script>