Python3:带有一些更改的文本副本

时间:2016-05-08 12:24:23

标签: python parsing text

我有这个原始源文本文件:

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选择整个{}并创建正确的源文本副本数量。

3 个答案:

答案 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.