我很难理解Python正则表达式库中的group
方法。在本文中,我尝试根据匹配对象对字符串进行替换。你知道吗
也就是说,我想用my_dict
字典中的特定字符串(分别用rep1
和rep2
替换匹配的对象(+
和\n
)。你知道吗
从这个question和answer可以看出, 我试过这个:
content = '''
Blah - blah \n blah * blah + blah.
'''
regex = r'[+\-*/]'
for mobj in re.finditer(regex, content):
t = mobj.lastgroup
v = mobj.group(t)
new_content = re.sub(regex, repl_func(mobj), content)
def repl_func(mobj):
my_dict = { '+': 'rep1', '\n': 'rep2'}
try:
match = mobj.group(0)
except AttributeError:
match = ''
else:
return my_dict.get(match, '')
print(new_content)
但是在计算v
时,我得到了None
的t
,然后是IndexError
。你知道吗
任何解释和示例代码将不胜感激。你知道吗
尽管Wiktor给出了真正的python答案,但仍然有一个问题,为什么OP的原始算法不起作用。 基本上有两个问题:
new_content = re.sub(regex, repl_func(mobj), content)
的调用将用第一个匹配的替换值替换regex
的所有匹配。你知道吗正确的调用必须是
new_content = re.sub(regex, repl_func, content)
。 如文档所述here,repl_func
通过当前匹配对象动态调用!你知道吗repl_func(mobj)
执行一些不必要的异常处理,可以简化:这相当于Wiktor的解决方案-他只是通过使用lambda表达式摆脱了函数定义本身。你知道吗
通过这种修改,
for mobj in re.finditer(regex, content):
循环变得多余,因为它多次执行相同的计算。你知道吗为了完整起见,这里有一个使用
re.finditer()
的工作解决方案。它从content
的匹配切片构建结果字符串:r'[+\-*/]'
正则表达式与换行符不匹配,因此您的'\n': 'rep2'
将不会被使用。否则,将\n
添加到regex:r'[\n+*/-]'
。你知道吗接下来,您将得到} docs :
None
,因为您的正则表达式不包含任何named capturing groups,请参见^{要使用匹配进行替换,甚至不需要使用
re.finditer
,使用re.sub
和lambda作为替换:参见Python demo
m.group()
获取整个匹配(整个匹配存储在match.group(0)
)。如果您在模式中有一对未转义的圆括号,它将创建一个capturing group,您可以使用m.group(1)
等访问第一个圆括号相关问题 更多 >
编程相关推荐