我正在尝试执行以下操作用正则表达式:
import re
x = re.compile('[^(going)|^(you)]') # words to replace
s = 'I am going home now, thank you.' # string to modify
print re.sub(x, '_', s)
我得到的结果是:
'_____going__o___no______n__you_'
我想要的结果是:
'_____going_________________you_'
自从^
只能在括号内使用[]
,这个结果是有道理的,但我不知道还能怎么做。
我什至尝试过'([^g][^o][^i][^n][^g])|([^y][^o][^u])'
但它产生'_g_h___y_'
.
并不像乍看起来那么容易,因为 RE 中没有“不”,除了^
inside [ ]
它只匹配一个字符(如您所发现的)。这是我的解决方案:
import re
def subit(m):
stuff, word = m.groups()
return ("_" * len(stuff)) + word
s = 'I am going home now, thank you.' # string to modify
print re.sub(r'(.+?)(going|you|$)', subit, s)
Gives:
_____going_________________you_
解释。 RE 本身(我总是使用原始字符串)匹配一个或多个任何字符(.+
)但是非贪婪的(?
)。这是在第一个括号组(方括号)中捕获的。后面跟着“going”或“you”或行尾($
).
subit
是一个函数(您可以在合理范围内将其称为任何名称),每次替换都会调用它。 A匹配对象已传递,我们可以从中检索捕获的组。我们只需要第一组的长度,因为我们用下划线替换每个字符。返回的字符串将替换与模式匹配的字符串。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)