我有这个原始源文本文件:
Hello {Jane Peter},
I send a email to your address {Jane@a.com Peter@a.com}.
我需要为每个人创建此文件的2个副本: (项目具有相同的索引 - 第一个{}中的Jane是第二个{}中的Jane@a.com
Hello Jane,
I send a email to your address Jane@a.com.
第二个:
Hello Peter,
I send a email to your address Peter@a.com
所以重点是从{}中选择项目并使用select选择整个{}并创建正确的源文本副本数量。
答案 0 :(得分:0)
使用此正则表达式匹配括号,然后遍历列表并生成所需的字符串。
import re
matches = re.findall(r'\{([^}]+)\}', s)
# you should verify that matches indeed contains two elements
names = matches[0].split()
mails = matches[1].split()
答案 1 :(得分:0)
您可以使用以下代码:
import re
s = '''Hello {Jane Peter},
I send a email to your address {Jane@a.com Peter@a.com}.'''
count = re.search('{(.*?)}', s).group(1).count(' ')
for i in range(count + 1):
print(re.sub('{(.*?)}', lambda x: x.group(1).split()[i], s))
输出:
Hello Jane,
I send a email to your address Jane@a.com.
Hello Peter,
I send a email to your address Peter@a.com.
首先使用re.search
查找要替换的第一个组,然后计算匹配中的空格以确定需要创建多少个副本。这当然只有在模板中使用的字符串不包含任何空格时才有效。如果您已经知道需要多少份副本,可以跳过这些副本。
下一代码将使用re.sub
在循环内生成副本。 {(.*?)}
将匹配需要替换的所有令牌并在括号内捕获文本。然后它将拆分捕获的文本并使用当前正在处理的索引处的项目。
虽然该示例适用于此特定方案,但我建议检查实际模板库以执行此类任务。 Jinja2
是一种受欢迎的选择。
答案 2 :(得分:0)
您可以使用Formatter.parse从占位符获取姓名/电子邮件:
from string import Formatter
s = """Hello {Jane Peter},
I send a email to your address {Jane@a.com Peter@a.com}."""
names, emails = (p for _, p, _, s in Formatter().parse(s) if p)
s = s.replace(names,"").replace(emails,"")
for name, email in zip(names.split(), emails.split()):
print(s.format(name, email))
输出:
Hello Jane,
I send a email to your address Jane@a.com.
Hello Peter,
I send a email to your address Peter@a.com.