[英]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()
来测试句子是否以{
开头。不想让他们检查。
正则表达式非常适合匹配文本。
使用正则表达式将{}
标记与模板转换为正则表达式:
>>> 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
如果字符串的开头匹配但结尾不匹配,则$
确保它不匹配。 $
表示“到此结束”:
>>> match = re.match(pattern, 'Welcome to work Roy have a great one! <ignored>')
>>> match is None
True
编辑:如果有人在玩愚蠢的乞g,您可能还想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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.