有没有办法一次进行多个不同的字符串替换?

Is there a way to do multiple different string replacements at once?

我正在做一项大学作业,由于我们被排除在使用任何网络抓取库之外,我仅限于正则表达式,我编写了当前代码(请原谅格式不佳,我还是很新):

def print_ticket():
    if event.get() == 1:
        web_page = urlopen(url1)
        html_code = web_page.read().decode("UTF-8")
        web_page.close()
        event_title = findall('<h6.*>(.+)</h6>', html_code)[0]
        event_image = findall('<img.* src="([^"]+)".*>', html_code)[4]
        event_url = 'https://suncorpstadium.com.au/what-s-on.aspx'
        event_details = findall('<h7.*>(.+)</h7>', html_code)[1]
        filename = event_title.replace(' ', '_') + '_Ticket.html'
        html_file = open(filename, 'w')
        html_file.write(ticket_template.replace('EVENT TITLE', event_title + ' Ticket'))
        html_file.write(ticket_template.replace('IMAGE', event_image))
        html_file.write(ticket_template.replace('DATE TIME', event_details))

我的问题是,每次我 运行 在我的 GUI 中发生该事件时,我的 Web 文档都会打印 3 组不同的模板,每个部分发生 .write 替换。

有没有办法一次制作多个 .replaces 而无需打印我的模板的多个副本?

问题是您调用了 write 3 次,而您只需要调用一次。那么你可以做什么:

        ticket_template = ticket_template.replace('EVENT TITLE', event_title + ' Ticket')
        ticket_template = ticket_template.replace('IMAGE', event_image)
        ticket_template = ticket_template.replace('DATE TIME', event_details)
        html_file.write(ticket_template)

这样就可以了,你只会得到 ticket_template 的最终输出。您也可以将其缩小为 one-liner 但它看起来不清晰

html_file.write(ticket_template.replace('EVENT TITLE', event_title + ' Ticket').replace('IMAGE', event_image).replace('DATE TIME', event_details))

您可以使用“f-string”或 Formatted string literal which was introduced in Python 3.6. To control its evaluation, it must be specified as the result returned from a lambda 函数来实现,如以下示例代码所示。 请注意,使用的变量名称 不必 必须是 ALL_CAPS,如图所示——我这样做只是为了更容易发现它们的使用位置。

ticket_template = lambda: f'''\
Congratulations! Your ticket to {EVENT_TITLE} has been booked!
{IMAGE}
{DATE} {TIME}
'''

filename = 'whatever.html'

with open(filename, 'w') as html_file:

    EVENT_TITLE = 'Some event title'
    IMAGE = 'Picture of event'
    DATE, TIME = '29/05', '4:00 PM'

    filled_in_ticket = ticket_template()  # *Call* the lambda function.
    html_file.write(filled_in_ticket)

print('fini')