使用正则表达式替换字符串的一部分

3
s = 'scores:start:4.2.1.3.4.3:final:55.34.13.63.44.34'

我正在尝试将 start 分数重置为 0.0.0.0.0.0,以便它显示为:

scores:start:0.0.0.0.0.0:final:55.34.13.63.44.34

这个有效:

re.sub('start\:(\d+\.\d+\.\d+\.\d+\.\d+\.\d+)','0.0.0.0.0.0',s)

但我希望找到更加灵活的方法来使用,以防分数的数量发生变化。

编辑: 实际上,我的示例无法工作,因为字符串中删除了start

scores:0.0.0.0.0.0:final:55.34.13.63.44.34

但我希望保留它:

scores:start:0.0.0.0.0.0:final:55.34.13.63.44.34

1
你可以使用:re.sub(r'start:\d+(\.\d+)+', '0.0.0.0.0.0', s) - anubhava
1
@HappyPy 真的吗?无论分数多少,您总是想要六个零吗? - Kelly Bundy
4个回答

3
您可以使用带有lambda的re.sub来将点分数字替换为相同数量的零:
>>> import re
>>> s = 'scores:start:4.2.1.3.4.3:final:55.34.13.63.44.34'
>>> re.sub(r'start:\d+(?:\.\d+)+', lambda m: re.sub(r'\d+', '0', m.group()), s)
'scores:start:0.0.0.0.0.0:final:55.34.13.63.44.34'

我们使用正则表达式 start:\d+(?:\.\d+)+ 来匹配以 start: 开头,后跟由点分隔的数字的文本。

lambda 部分,我们将每个1个或多个数字替换为0,以获得与输入相同数量的零。


2

可以将 final 前的所有数字替换为零:

re.sub(r'\d+(?=.*final)', '0', s)
在线尝试! 或许如果有更多的分数,可以更加高效。
re.sub(r'\d|(final.*)', lambda m: m[1] or '0', s)

1
另一个在 re.sub 中使用的 lambda 函数:
import re 
s = 'scores:start:4.2.1.3.4.3:final:55.34.13.63.44.34'
pat=r'(?<=:start:)([\d.]+)(?=:final:)'

>>> re.sub(pat, lambda m: '.'.join(['0']*len(m.group(1).split('.'))), s)
scores:start:0.0.0.0.0.0:final:55.34.13.63.44.34

0

使用正则表达式的变体PyPi模块

(?:\bstart:|\G(?!^))\.?\K\d+

模式匹配

  • (?: 非捕获组
    • \bstart: 匹配 start:
    • | 或者
    • \G(?!^) 断言当前位置在前一个匹配的结尾,而不是字符串的开头
  • ) 关闭非捕获组
  • \.?\K 匹配可选的句点,并清除当前匹配缓冲区(忘记到目前为止匹配的内容)
  • \d+ 匹配一个或多个数字(将被替换为0)

正则表达式演示

import regex

s = 'scores:start:4.2.1.3.4.3:final:55.34.13.63.44.34'
pattern = r"(?:\bstart:|\G(?!^))\.?\K\d+"
print(regex.sub(pattern, '0', s))

输出

scores:start:0.0.0.0.0.0:final:55.34.13.63.44.34

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接