【问题标题】:How to match a substring in a string, ignoring case如何匹配字符串中的子字符串,忽略大小写
【发布时间】:2011-09-28 14:56:15
【问题描述】:

我正在寻找 Python 中的忽略大小写字符串比较。

我试过了:

if line.find('mandy') >= 0:

但忽略大小写没有成功。我需要在给定的文本文件中找到一组单词。我正在逐行读取文件。一行字可以是mandyMandyMANDY等(我不想用toupper/@987654323 @ 等)。

我正在寻找下面 Perl 代码的 Python 等效项。

if ($line=~/^Mandy Pande:/i)

【问题讨论】:

    标签: python perl


    【解决方案1】:

    如果不想使用str.lower(),可以使用regular expression

    import re
    
    if re.search('mandy', 'Mandy Pande', re.IGNORECASE):
        # Is True
    

    【讨论】:

    • re.search(pattern, string, flags=0) docs.python.org/3/library/re.html#re.search 扫描字符串,寻找正则表达式模式产生匹配的第一个位置,并返回对应的匹配对象。如果字符串中没有位置与模式匹配,则返回 None;请注意,这与在字符串中的某个点找到零长度匹配不同。
    • 注意特殊字符。它们可能会导致此方法出现问题
    【解决方案2】:

    还有另一个帖子here。试试看这个。

    顺便说一句,您正在寻找 .lower() 方法:

    string1 = "hi"
    string2 = "HI"
    if string1.lower() == string2.lower():
        print "Equals!"
    else:
        print "Different!"
    

    【讨论】:

    • 不,他不是。 " [我不想使用 toupper/tolow 等]"
    • 我知道,我读过,但是 re.match 和 re.search 解决方案不检查正则表达式中使用的特殊字符,例如 () 或 []
    • 这个问题与 () 或 [] 有什么关系?
    • 这不是一个更通用的答案,因为 tolower/toupper 解决方案不适合 Unicode。
    • 如果你真的不需要避免它(出于某种原因,比如 unicode),使用 lower() 进行处理可能比正则表达式匹配更有效。
    【解决方案3】:

    试试:

    if haystackstr.lower().find(needlestr.lower()) != -1:
      # True
    

    【讨论】:

      【解决方案4】:
      a = "MandY"
      alow = a.lower()
      if "mandy" in alow:
          print "true"
      

      解决方法

      【讨论】:

        【解决方案5】:

        您也可以使用:s.lower() in str.lower()

        【讨论】:

        • OP 说“我不想使用 toupper/tolower 等。
        【解决方案6】:

        您可以将in 运算符与字符串的lower 方法结合使用。

        if "mandy" in line.lower():

        【讨论】:

          【解决方案7】:

          在将str.casefold 应用于两个字符串后,可以使用in 运算符。

          str.casefold 是不区分大小写比较的推荐方法。

          返回字符串的大小写折叠副本。大小写字符串可用于无大小写匹配。

          大小写折叠类似于小写,但更具侵略性,因为它旨在删除字符串中的所有大小写区别。例如,德语小写字母“ß”相当于“ss”。由于它已经是小写字母,因此 lower() 不会对 'ß' 执行任何操作; casefold() 将其转换为“ss”。

          大小写折叠算法在 Unicode 标准的第 3.13 节中进行了描述。

          3.3 版中的新功能。

          对于不区分大小写的子字符串搜索:

          needle = "TEST"
          haystack = "testing"
          if needle.casefold() in haystack.casefold():
              print('Found needle in haystack')
          

          对于不区分大小写的字符串比较:

          a = "test"
          b = "TEST"
          if a.casefold() == b.casefold():
              print('a and b are equal, ignoring case')
          

          【讨论】:

            【解决方案8】:
            import re
            if re.search('(?i)Mandy Pande:', line):
                ...
            

            【讨论】:

            • 如果我没记错的话,这不会检查/匹配正则表达式中的控制字符,例如 [] 或 ()...
            【解决方案9】:

            this

            In [14]: re.match("mandy", "MaNdY", re.IGNORECASE)
            Out[14]: <_sre.SRE_Match object at 0x23a08b8>
            

            【讨论】:

              【解决方案10】:

              如果是pandas系列,可以在str.contains中提及case=False

              data['Column_name'].str.contains('abcd', case=False) 
              

              或者如果只是两个字符串比较,请尝试下面的其他方法

              您可以使用 casefold() 方法。 casefold() 方法在比较时会忽略大小写。

              firstString = "Hi EVERYONE"
              secondString = "Hi everyone"
              
              if firstString.casefold() == secondString.casefold():
                  print('The strings are equal.')
              else:
                  print('The strings are not equal.')
              

              输出:

              The strings are equal.
              

              【讨论】:

                猜你喜欢
                • 2019-02-06
                • 1970-01-01
                • 1970-01-01
                • 2019-08-29
                • 2022-11-14
                • 2013-11-19
                • 2016-11-11
                • 1970-01-01
                相关资源
                最近更新 更多