使用 re sub 替换匹配的子字符串

Replace matched susbtring using re sub

有没有办法使用单个 re.sub() 行替换匹配的模式子字符串?。 我想避免的是对当前 re.sub() 输出使用字符串替换方法。

Input =  "/J&L/LK/Tac1_1/shareloc.pdf"

Current output using re.sub("[^0-9_]", "", input): "1_1"

Desired output in a single re.sub use: "1.1"

根据文档,re.sub 定义为

re.sub(pattern, repl, string, count=0, flags=0)

If repl is a function, it is called for every non-overlapping occurrence of pattern.

这就是说,如果你传递一个lambda函数,你可以将代码保留在一行中。此外,请记住匹配的字符可以通过以下方式更容易地访问单个组:x[0].

我从正则表达式中删除了 _ 以获得所需的输出。

txt = "/J&L/LK/Tac1_1/shareloc.pdf"
x = re.sub("[^0-9]", lambda x: '.' if x[0] is '_' else '', txt)
print(x)

无法使用 Python re.sub 中的字符串替换模式来替换两个可能的字符串,因为 Python [=11] 中不支持条件替换构造=].所以, 或使用其他 work-arounds.

您似乎只希望输入字符串中有一个 <DIGITS>_<DIGITS> 匹配项。在这种情况下,您可以使用

import re
text = "/J&L/LK/Tac1_1/shareloc.pdf"
print( re.sub(r'^.*?(\d+)_(\d+).*', r'.', text, flags=re.S) )
# => 1.1

Python demo. See the regex demo详情:

  • ^ - 字符串开头
  • .*? - 尽可能少的零个或多个字符
  • (\d+) - 第 1 组:一个或多个数字
  • _ - 一个 _ 字符
  • (\d+) - 第 2 组:一个或多个数字
  • .* - 尽可能多的零个或多个字符。