繁体   English   中英

如何忽略方括号之间的字符?

[英]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返回的任何版本进行比较,并根据它们是否匹配来获得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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM