我想用一个新数字(比如 100)替换字符串中的第三个参数。匹配的字符串始终以 function 开头,第一个参数为 true 或 false,第二个参数为数字。
Expected
| |
v v
'function(true, 0, 15)' --> 'function(true, 0, 100)'
'function(false, 0, 23)' --> 'function(false, 0, 100)'
我一直在阅读相关帖子,但我相信我一定误解了一些正则表达式的概念。下面的代码是我试过的,但它总是替换整个字符串:
import re
string = 'function(true, 0, 15)'
regex = re.compile('function\([a-zA-Z]*, [0-9]*, ([0-9]*)\)')
res = re.sub(regex, '100', string)
print(res) # 100
# Expected: function(true, 0, 100)
问题:您能指出为什么上面的代码不起作用吗?如何编写代码才能达到预期的结果?
请您参考如下方法:
因为您要替换的数字后面紧跟着一个右括号 ) , 你可以只使用这个 \d+(?=\s*\))正则表达式并将其替换为 100或者你想要的任何值。试试这些 Python 代码,
import re
string = 'function(true, 0, 15)'
regex = re.compile(r'\d+(?=\s*\))')
res = re.sub(regex, '100', string)
print(res)
打印,
function(true, 0, 100)
此外,您的代码未按预期工作并且将整个字符串替换为 100 的原因因为你编写正则表达式的方式,它匹配你的整个输入和 re.sub函数替换所有与第二个参数匹配的内容,因此您的所有输入都被替换为 100 .但是您想要的是,将第三个参数替换为 100因此,您编写正则表达式的方式应该只匹配第三个参数值,如下面的正则表达式演示所示,
Regex Demo matching only what you want to replace
并且您当前的正则表达式匹配您的整个输入,如下面的演示所示,
Regex Demo with your regex matching whole input
此外,如果您感觉更好并且想要匹配整个输入然后有选择地仅替换第三个参数,您可以使用此正则表达式来捕获函数名称和 group1 中的前两个参数,就像您想要在原始正则表达式中捕获一样,
(function\([a-zA-Z]*, [0-9]*, )[0-9]*\)
并将其替换为\g<1>100)其中 \g<1>引用在 group1 中捕获的值,并进一步替换为 100)
