在两个子字符串之间替换一个子字符串



如何在下面提供的l字符串中用222.6替换page1/_type-A之间的子字符串?

l = 'https://homepage.com/home/page1/222.6 a_type-A/go'
replace_with = '222.6'

预期结果:

https://homepage.com/home/page1/222.6_type-A/go

我试过了:

import re
re.sub('page1/.*?_type-A','',l, flags=re.DOTALL)

但它也去除了CCD_ 5和CCD_。

您可以这样使用re.sub

import re
l = 'https://homepage.com/home/page1/222.6 a_type-A/go'
replace_with = '222.6'
print (re.sub(r'(?<=page1/).*?(?=_type-A)', replace_with, l))

输出:

https://homepage.com/home/page1/222.6_type-A/go

RegEx演示

RegEx分解:

  • (?<=page1/):Lookbacking断言我们在前一位置有page1/
  • .*?:匹配任意字符串中的0个或多个(惰性(
  • (?=_type-A):展望未来,断言我们在下一个位置有_type-A

您可以使用

import re
l = 'https://'+'homepage.com/home/page1/222.6 a_type-A/go'
replace_with = '222.6'
print (re.sub('(page1/).*?(_type-A)',fr'g<1>{replace_with}2',l, flags=re.DOTALL))

输出:https://homepage.com/home/page1/222.6_type-A/go

在线查看Python演示

请注意,您使用了一个空字符串作为替换参数。在上面的片段中,.*?之前和之后的部分被捕获g<1>是指替换模式中的第一组值,2是指第二组值。明确的反向引用形式(g<X>(用于避免反向引用问题,因为在反向引用后面有一个数字。

由于替换模式不包含反斜杠,因此不需要对其中的任何内容进行预处理(转义(

这是有效的:

import re
l = 'https://homepage.com/home/page1/222.6 a_type-A/go'
pattern = r"(?<=page1/).*?(?=_type)"
replace_with = '222.6'
s = re.sub(pattern, replace_with, l)
print(s)

该模式使用正向前瞻和反向断言?<=?=。只有当字符串前后都有模式中的断言,但不使用它们时,才会发生匹配。这意味着re.sub查找前面有page1/、后面有_type的字符串,但只替换中间的部分。

最新更新