我怎样才能忽略括号之间的字符?
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 返回的任何版本进行比较,仍然会得到 True
或 False
,具体取决于它们是否匹配。
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
示例: 系统中的硬编码输入:
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 返回的任何版本进行比较,仍然会得到 True
或 False
,具体取决于它们是否匹配。
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