如何使用正则表达式仅匹配位于浮点数之后的字母并替换为另一个字符串

How to use regex to match only a letter positioned after a float number and substitute for another string

所以我有以下文件 f1:

---
Proj: pgm1
Status: success
summary:  17 passed, 17 warnings in 18.73s
---
Proj: pgm2
Status: success
summary:  28 passed, 28 warnings in 5.16s
---
Proj: pgm3
Status: failed
summary:  1 failed, 63 passed, 32 warnings in 8.72s
---

我需要找到一个正则表达式模式,returns 只是浮点值后的“s”(即 8.72s),然后是另一个用“s”代替“秒”的正则表达式

我有这个正则表达式模式来匹配整个浮点数和字母:"\b\d+\.\d+[a-z]"

我也有这个替换表达式:re.sub(r"pattern", " seconds", string) 但是,我再次缺少正确的模式来匹配浮点值后的字母“s”。

关于如何使它只匹配字母“s”而不是整个“8.72s”的任何建议,以便我可以在之后用“seconds”替换它,所以文件最后看起来像这样?:

---
Proj: pgm1
Status: success
summary:  17 passed, 17 warnings in 18.73 seconds
---
Proj: pgm2
Status: success
summary:  28 passed, 28 warnings in 5.16 seconds
---
Proj: pgm3
Status: failed
summary:  1 failed, 63 passed, 32 warnings in 8.72 seconds
---

在模式 \b\d+(?:\.\d+)?s\b 上使用 re.sub 在这里应该有效:

inp = """---
Proj: pgm1
Status: success
summary:  17 passed, 17 warnings in 18.73s
---
Proj: pgm2
Status: success
summary:  28 passed, 28 warnings in 5.16s
---
Proj: pgm3
Status: failed
summary:  1 failed, 63 passed, 32 warnings in 8.72s
---"""

output = re.sub(r'\b(\d+(?:\.\d+)?)s\b', r' seconds', inp)
print(output)

如果你运行上面的脚本,秒项显示正确。

Any suggestions on how to make it only match the letter "s"

这将通过其他语言的正则表达式环视来完成,因此 (?<=\d+)s 将匹配一些数字后的 as 并且只替换“s”。这种方法在这里很困难,因为 Python 的正则表达式引擎无法处理。

相反,更容易识别数字和字母,捕获数字并将它们放回替换字符串中。

例如

>>> text = "summary:  17 passed, 17 warnings in 18.73s"

>>> re.sub(r"(\b\d+\.\d+)[a-z]", r" seconds", text)
'summary:  17 passed, 17 warnings in 18.73 seconds'

()做一个捕获组,将捕获组1的内容放入替换字符串