我是python中的正则表达式的新手,正在尝试替换字符串中的子字符串。我的子字符串以一个特定的单词开头,以两个换行符结尾。
下面是我尝试过的
import re
a=re.sub(r'Report from.+', r' ', 'To: abcd@gef.org; Report from xxxxx \n Category\t Score\t \n xxxxxxxxxxx xxxxxxxxt \n xxxxxxx\t xxxxxxx\t \n\n original message\n')
输出:
To: abcd@gef.org;
Category Score
xxxxxxxxxxx xxxxxxxxt
xxxxxxx xxxxxxx
original message
预期输出:
To: abcd@gef.org;
original message
我也尝试过:
re.sub(r'Report from.+\n', r' ', 'To: abcd@gef.org; Report from xxxxx \n Category\t Score\t \n xxxxxxxxxxx xxxxxxxxt \n xxxxxxx\t xxxxxxx\t \n\n original message\n')
但它甚至与“ Report from”字面值都不匹配。
我想我已经中途了。谁能帮忙吗?
编辑:我要替换以“ Report from”开头的所有内容,直到第一次出现两个换行符
答案 0 :(得分:1)
您要使用?
标记要替换的子字符串的'end'。
import re
text = 'To: abcd@gef.org; Report from xxxxx \n Category\t Score\t \n xxxxxxxxxxx xxxxxxxxt \n xxxxxxx\t xxxxxxx\t \n\n original message\n'
a=re.sub(r'Report from.+?\n\n', r'\n', text, flags=re.DOTALL)
print(a)
To: abcd@gef.org;
original message
答案 1 :(得分:1)
考虑编写一个简单的状态机来做到这一点。您有两种状态:正在块中寻找第一行,或者在块中寻找空行。 (“两个连续的换行符”与“当我逐行阅读文件时看到空白行”相同。)
import enum from Enum, auto
class LookFor(Enum):
REPORT = auto()
BLANK = auto()
state = LookFor.REPORT
with open(filename, 'r') as f:
for line in f:
if state == LookFor.REPORT:
print(line, end='')
if line.startswith('Report from'):
state = LookFor.BLANK
elif state == LookFor.BLANK:
if line == '\n':
print(line, end='')
state = LookFor.TO
我编写的特定代码对要查找的内容进行了一些假设,尤其是您可以逐行进行迭代;您可以对此进行调整,以针对要切换到哪个状态做出更复杂的决定,或者添加适合您的应用程序的其他状态。