2024-05-23 16:18:38 发布
网友
re.sub('a(b)','d','abc')产生dc,而不是adc。
re.sub('a(b)','d','abc')
dc
adc
为什么re.sub要取代整个捕获组,而不仅仅是捕获组'(b)'?
re.sub
因为它应该取代整个模式的出现:
Return the string obtained by replacing the leftmost non-overlapping occurrences of the pattern in string by the replacement repl.
如果它只替换某些子组,那么包含多个组的复杂正则表达式将不起作用。有几种可能的解决方案:
re.sub('ab', 'ad', 'abc')
re.sub('(a)b', r'\1d', 'abc')
repl
Match
re.sub('(?<=a)b', r'd', 'abxb')
adxb
?<=
因为这正是re.sub()doc告诉你的:
re.sub()
'a(b)'
(a)??b
如果你想要你想要的输出,你需要在'(a)??'上进行非贪婪匹配:
'(a)??'
>>> re.sub('(a)??b','d','abc') 'dc'
import re pattern = re.compile(r"I am (\d{1,2}) .*", re.IGNORECASE) text = "i am 32 years old" if re.match(pattern, text): print( re.sub(pattern, r"Your are \1 years old.", text, count=1) )
如上所述,首先我们编译一个带有不区分大小写标志的regex模式。
然后我们检查文本是否与模式匹配,如果匹配,我们将引用regex模式(age)中唯一的组(组号为1)。
因为它应该取代整个模式的出现:
如果它只替换某些子组,那么包含多个组的复杂正则表达式将不起作用。有几种可能的解决方案:
re.sub('ab', 'ad', 'abc')
-我的最爱,因为它非常可读和明确。re.sub('(a)b', r'\1d', 'abc')
repl
参数,并使其处理Match
对象并返回所需的结果。re.sub('(?<=a)b', r'd', 'abxb')
产生adxb
。小组开头的?<=
说“这是一个展望”。因为这正是
re.sub()
doc告诉你的:'a(b)'
表示“匹配‘a’,带有可选的尾随‘b’”。(它可以自己匹配“a”,但它不可能像你想象的那样自己匹配“b”。如果你是这个意思,那么使用非贪婪的(a)??b
)。如果你想要你想要的输出,你需要在
'(a)??'
上进行非贪婪匹配:如上所述,首先我们编译一个带有不区分大小写标志的regex模式。
然后我们检查文本是否与模式匹配,如果匹配,我们将引用regex模式(age)中唯一的组(组号为1)。
相关问题 更多 >
编程相关推荐