我怎样才能忽略括号之间的字符?

How can i ignore the characters between brackets?

示例: 系统中的硬编码输入:

Welcome to work {sarah} have a great {monday}! 

我从 api 电话中收到的电话可能因星期几或姓名示例而异:

Welcome to work Roy have a great Tuesday!

我想比较这两行,如果括号中的术语不匹配,则给出错误。

我开始的方法是使用 assert,这是我需要的确切功能,然后通过使用 .startswith() 忽略以 { 开头的句子进行测试,但我没有在我不想检查的括号之间的细节方面,我的工作一直很成功。

Regular expressions 适合匹配文本。

将您的模板转换为正则表达式,使用正则表达式匹配 {} 标签:

>>> import re

>>> template = 'Welcome to work {sarah} have a great {monday}!'

>>> pattern = re.sub('{[^}]*}', '(.*)', template)
>>> pattern
'Welcome to work (.*) have a great (.*)!'

为了确保匹配在模式的末尾停止,输入 $:

>>> pattern += '$'

然后将您的字符串与模式匹配:

>>> match = re.match(pattern, 'Welcome to work Roy have a great Tuesday!')
>>> match.groups()
('Roy', 'Tuesday')

如果您尝试匹配一个不匹配的字符串,您将一无所获:

>>> match = re.match(pattern, 'I wandered lonely as a cloud')
>>> match is None
True

如果字符串的开头匹配但结尾不匹配,$ 会确保它不匹配。 $ 表示 "end here":

>>> match = re.match(pattern, 'Welcome to work Roy have a great one! <ignored>')
>>> match is None
True

编辑:您可能还想 escape 您的意见,以防有人玩傻乞丐。

您可以制作不包含括号内任何内容的副本并进行比较。使用正则表达式相对容易。作为一个函数,它可能看起来像这样:

import re

# compare two strings, ignoring everything that has curly brackets around it
def compare_without_brackets(s_1, s_2, p=re.compile(r"{.*?}")):
  return p.sub('', s_1) == p.sub('', s_2) 

# example
first = 'Welcome to work {sarah} have a great {monday}!'
second = 'Welcome to work {michael} have a great {tuesday}!'

print(compare_without_brackets(first, second))
>> True

编辑:看到我有问题后修改了我的答案。它现在的工作方式是将所有带有大括号的内容都替换为通用匹配。现在您可以将硬编码版本与从 API 返回的任何版本进行比较,仍然会得到 TrueFalse,具体取决于它们是否匹配。

import re

# compare a hardcoded string with curly braces with one returned from the API
def compare_without_brackets(hardcoded, from_API, p=re.compile(r"{.*?}")):
  pattern = re.compile(p.sub(r'(.*)', hardcoded))
  return pattern.match(from_API) is not None

# example
first = 'Welcome to work {sarah} have a great {monday}!'
second = 'Welcome to work michael have a great tuesday!'

print(compare_without_brackets(first, second))
>>>> True