这是我想要完成的一个非常虚拟的示例,输入是文本:
{placeholder}, John Jones\n{placeholder}, Ben Franklin\n{placeholder}, George Washington
我想要做的是将 {placeholder}
的每个实例替换为使用同一行数据的函数的输出,例如名字的首字母和姓氏(需要将名字和姓氏输入到函数中)。
def initializer(name):
return f"{name.split(' ')[0][0]}. {name.split(' ')[1]}"
期望的结果是:
J. Jones, John Jones\nB. Franklin, Ben Franklin\nG. Washington, George Washington
最佳答案
带有替换函数的正则表达式可以工作:
import re
s = "{placeholder}, John Jones\n{placeholder}, Ben Franklin\n{placeholder}, George Washington"
def repl_function(m):
return "{}. {}, {} {}".format(m.group(1)[0],m.group(2),m.group(1),m.group(2))
print(re.sub("\{placeholder},\s+(.*?)\s(.*)",repl_function,s))
打印:
J. Jones, John Jones
B. Franklin, Ben Franklin
G. Washington, George Washington
它是如何工作的?
它捕获 {placeholder}
和 2 个单词(直到行尾,与 .*
不匹配,因为未设置 re.DOTALL
并创建 2 个组(2 个名称部分)。
匹配时,它使用匹配对象调用 repl_function
替换函数(re.sub
的第二个参数可以是字符串、字节对象或接受一个参数:匹配对象)。
只需通过缩短名字并重复其他信息,将重新格式化的匹配对象作为字符串返回(这也可以在 lambda
中完成,但作为真正的函数,它可能更具可读性)
关于python-3.x - 使用同一行中的文本替换多行字符串中的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58086885/