'how can i use re.findall to match a substring using python regex?
I have the following string variable called strSourceCode in python3.x,
'uint256 private constant _tTotal = 100000000 * 10**9;
uint256 private _rTotal = (MAX - (MAX % _tTotal));
_maxTxAmount = 300000000 * 10**9;'
I would like to match '100000000 * 10**' and'300000000 * 10**' and it should give me the following two lines as output using re.findall
uint256 private constant _tTotal = 100000000 * 10**9;
_maxTxAmount = 300000000 * 10**9;
Currently i have the following code:
pattern = '^.*[0-9]0{4,}.*$'
matches = re.findall(pattern, strSourceCode, re.MULTILINE)
which falsely outputs as:
_maxTxAmount = 300000000 * 10**9;0000 * 10**9;
Solution 1:[1]
We can try using re.findall
here in multiline mode:
inp = """uint256 private constant _tTotal = 100000000 * 10**9;
uint256 private _rTotal = (MAX - (MAX % _tTotal));
_maxTxAmount = 300000000 * 10**9;"""
lines = re.findall(r'^.*\d+\s*\*\s*\d+\*\*\d+.*$', inp, flags=re.M)
print(lines)
This prints:
['uint256 private constant _tTotal = 100000000 * 10**9;',
'_maxTxAmount = 300000000 * 10**9;']
The regex pattern used here attempts to find any line containing an integer multiplied by 10 to some integer power.
Solution 2:[2]
pattern = '[0-9]0{4,}[0-9\s*]*'
matches = re.findall(pattern, strSourceCode, re.MULTILINE)
It doesn't match entire lines.
The pattern searches for digits followed by at least four zeroes which is then followed by any number of spaces, digits, and *
characters.
If you want to match exactly * 10**
after you big number you can do this:
pattern = '[0-9]0{4,} \* 10\*\*'
matches = re.findall(pattern, strSourceCode, re.MULTILINE)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Tim Biegeleisen |
Solution 2 | Cubed |