如何在下面提供的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
的字符串,但只替换中间的部分。