regex 在循环中基于str对象构建正则表达式

svujldwt  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(95)

我有一个包含文本的列表,我想合并成一个字符串对象。但是,我想在导入文本时编辑它:对于第一页,我想删除“marcacao_comeco”之前的所有内容,对于最后一页,我想删除“marcacao_fim”之后的所有内容。然而,re.sub函数似乎不能处理Python对象。我创建了下面的示例来演示这个问题。我需要不断地构建正则表达式,因为我对许多文档都这样做。

page1 = ' Once upon a time, there was a little girl named Lily who lived in a small village at the foot of a mountain.'
page2 = 'One day, while she was walking in the forest, she stumbled upon a hidden cave.'
page3 = 'Lily saw a bear, who had already spotted her. Trembling with fear, Lily thought it was the end. But to her surprise, the bear did not attack her. Instead, it led her safely out of the forest'

pages = [page1, page2, page3]

marcacao_comeco = 'girl named'
marcacao_fim = 'the bear did not attack her.'

final_text = ''

for i, page in enumerate(pages):
    if i == 0:

        regex_inicio = re.escape(marcacao_comeco) + r'.*\n'
        page = re.sub(regex_inicio, '', page)
    
    elif i == len(pages) - 1:
        regex_fim = r'\n.*' + re.escape(marcacao_fim)
        page = re.sub(regex_fim, '', page)

    else:
        page = page
    
    final_text = final_text + page

final_text

我得到的输出只是将页面连接起来。我希望我的输出以“住在一个小村庄的名叫莉莉的女孩”开始,并以“熊没有攻击她”结束

t0ybt7op

t0ybt7op1#

这里有几件事。正如注解中所指出的,你的字符串不包含\n,所以你的正则表达式将无法匹配任何东西。如果你从代码中删除\n,你会发现你的正则表达式将匹配你的一些文本,但它将完全替换为''
我的方法是使用组,所以对于每一行,你将把它分成一个要删除的组和一个要保留的组。例如,我将构建第一个正则表达式为(.*)(girl named.*),所以它将匹配整个字符串并将其分成$1。(要保留的字符串之前的所有内容)和$2(字符串的其余部分,从girl named开始)。我们将替换为您想要保留的组,而不是替换为'',即,$2。在python中,您需要使用'\g<2>'来表示第二个组。对于最后一页,您必须保留第一个组并删除第二个组,因此我们需要稍微调整正则表达式。
这是基于上面解释的方法的固定循环:

for i, page in enumerate(pages):
if i == 0:
    regex_inicio = r'(.*)(' + re.escape(marcacao_comeco) + r'.*)'        
    page = re.sub(regex_inicio, '\g<2>', page)
    
elif i == len(pages) - 1:
    regex_fim = r'(.*' + re.escape(marcacao_fim) + r')(.*)'
    page = re.sub(regex_fim, '\g<1>', page)

else:
    page = page

相关问题