【问题标题】:How to check if a string has atleast 1 variation of a word on top of a constant word in Python?如何检查一个字符串是否在 Python 中的常量单词之上至少有 1 个单词变体?
【发布时间】:2019-03-15 14:57:02
【问题描述】:

因此,我的脚本提取了网站上列出的产品标签,并且我不断地寻找一种产品,我知道该产品具有这个特定关键字和另一个拼写不时变化的关键字。关键字常量是“blazer”,另一个变量关键字是“10”或“10”。这是找到包含“blazer”和“10”或“10”的标题的正确方法吗?

if 'blazer' in compareName and 'ten' or '10' in compareName:
  func()
else:
  pass

所以如果字符串变量 compareName 同时具有“blazer”和“10”或“blazer”和“10”,我希望函数运行

【问题讨论】:

  • 不,您需要在 or 语句周围加上括号。
  • 喜欢这个? if 'blazer' in compareName 和 ('ten' or '10') in compareName:
  • 不,我只是在谈论优先级。有关您需要做什么的完整说明,请参阅史蒂夫的回答。
  • 不,对于包含 '10' 但不包含 '10' 的字符串,这将返回 true 查看我的答案!
  • 关于编写布尔表达式和字符串操作的教程将回答这个问题。此外,您不应该在有记录的问题之前发布代码 - 如果您不知道您的代码做了什么,那么您还没有准备好提出问题。

标签: python regex web-scraping


【解决方案1】:

'ten' or '10' in compareName 部分不会给您想要的结果。每次都会返回“十”!相反,您需要检查 '10' 是否在 compareName 中,还要检查 '10' 是否在 compareName 中,并将 or 放在两者之间,如下所示:

if 'blazer' in compareName and ('ten' in compareName or '10' in compareName):

【讨论】:

    【解决方案2】:

    我确信有更好的方法来做到这一点,但只需保持您的语法并给出正确的答案,您的 if 语句应该是

    if 'blazer' in compareName and ('ten' in compareName or '10' in compareName):
        func()
    else:
        pass
    

    【讨论】:

      【解决方案3】:

      您似乎对编程的工作原理存在根本性的误解。我强烈建议您在继续之前阅读Comparisons

      这里声明:

      if 'blazer' in compareName and 'ten' or '10' in compareName:
      

      本质上评估为:

      if (('blazer in compareName) == True) and ('ten' == True) or (('10' in compareName) == True):
      

      假设 compareName 是“blazerten”,它将评估为:

      if True and True or False:
      
      # Note: Python evaluates OR before AND operators
      
      # Result: True
      

      看起来不错?没有!如果compareName 是'blazer',它将评估相同的东西。因为第二个条件'ten' 将始终计算为True,因为它不是一个空字符串,所以一旦满足第一个条件,第二个和第三个条件就没有实际意义了。

      正确的方法是提到的其他答案,您需要分别进行比较:

      if 'blazer' in compareName and 
         'ten' in compareName or 
         '10' in compareName:
      

      注意:如果您尊重operation precedence.,则不需要括号

      如果你觉得有点冒险并且不喜欢重复自己太多,你可以尝试在列表理解中表达这一点:

      if 'blazer' in compareName and
         any([part in compareName for part in ['ten', '10']]):
      

      第二个条件现在由any() function 处理。当然,需要注意的是,你放弃了一点可读性。好处是,如果您需要在 OR 子句中比较的不仅仅是 'ten''10',您可以简单地添加到第二个条件的列表中。

      【讨论】:

        猜你喜欢
        • 2017-10-16
        • 2021-09-13
        • 1970-01-01
        • 1970-01-01
        • 2021-04-04
        • 1970-01-01
        • 2011-07-16
        • 2014-08-09
        • 2020-12-03
        相关资源
        最近更新 更多