【问题标题】:String contains any character in group?字符串包含组中的任何字符?
【发布时间】:2013-10-19 07:25:00
【问题描述】:

我有一组字符:\,/,?,% 等。 我也有一个字符串,可以说“这是我的字符串 % 我的字符串?”

我想检查字符串中是否存在任何字符。

这不是检查子字符串,而是检查集合中的字符。

我可以这样做:

my_str.find( "/" ) or my_str.find( "\\" ) or my_str.find( "?" )

但它非常丑陋和低效。

有没有更好的办法?

【问题讨论】:

    标签: python


    【解决方案1】:

    你可以在这里使用any

    >>> string = r"/\?%"
    >>> test = "This is my string % my string ?"
    >>> any(elem in test for elem in string)
    True
    >>> test2 = "Just a test string"
    >>> any(elem in test2 for elem in string)
    False
    

    【讨论】:

    • 出现错误。这是我的字符串:invalid_chars = "/\\?%*:|"\. " 并且错误是“行继续字符后出现意外字符”。使用此处的集合:en.wikipedia.org/wiki/Filename#Reserved_characters_and_words
    • 您的字符串格式错误。使用r'/\?%*:|"<>. '。我相信它有你想要的所有角色。
    • 假设(较小的)永久集(“字符串”)中的字符都可能被远程看到,那么你把它倒过来,它应该是any(elem in string for elem in test)而不是其他方式大约。正如您所拥有的那样,您将用尽整个(较长的)输入值,只寻找集合中的第一个字符,然后再继续下一个,依此类推。我刚刚给出的代码 sn-p 检查输入中每个字符的候选对象的 all,然后再继续下一个。这允许更频繁地提前放弃,假设目标都有一定的可能性。
    • 因为这种方法依赖于elem in test——两者都是字符串——它会进行子字符串搜索。这可能会更慢,但更灵活。 for elem in string 可以从列表(或其他可迭代对象)中获取字符串,而不是从源字符串中将元素绘制为单独的符号。
    【解决方案2】:

    我认为 Sukrit 可能给出了最 Pythonic 的答案。但是你也可以通过集合操作来解决这个问题:

    >>> test_characters = frozenset(r"/\?%")
    >>> test = "This is my string % my string ?"
    >>> bool(set(test) & test_characters)
    True
    >>> test2 = "Just a test string"
    >>> bool(set(test2) & test_characters)
    False
    

    【讨论】:

    • 在逻辑上下文中,例如if 语句,bool() 调用是不必要的。即if set(test2) & test_characters:test_characters 也不需要被冻结。
    • 投票最多的答案也可以使用string 替换为要查找的子字符串列表。基于set 的方法只能查找单个字符(严格来说,Unicode 代码点),因为它不再对字符串使用in 运算符(它执行子字符串搜索,与测试单个元素的列表不同)。
    【解决方案3】:

    使用正则表达式!

    import re
    
    def check_existence(text):
        return bool(re.search(r'[\\/?%]', text))
    
    text1 = "This is my string % my string ?"
    text2 = "This is my string my string"
    
    print check_existence(text1)
    print check_existence(text2)
    

    【讨论】:

      【解决方案4】:
      In [1]: import re
      In [2]: RE = re.compile('[\\\/\?%]')
      In [3]: RE.search('abc')
      
      In [4]: RE.search('abc?')
      Out[4]: <_sre.SRE_Match at 0x1081bc1d0>
      In [5]: RE.search('\\/asd')
      Out[5]: <_sre.SRE_Match at 0x1081bc3d8>
      

      None 表示集合中的非字符存在于目标字符串中。

      【讨论】:

        【解决方案5】:

        当然也是最非 Pythonic 的方式,但至少对我来说更具可读性。

        定义函数:

        def containsSpecialCharacters(self, string: str, test: str) -> bool:
            for special in string:
                if special in test:
                    return True
            return False
        

        这个电话:

        string = r"/\?%"
        test = "This is my string % my string ?"
        print(self.containsSpecialCharacters(string, test))
        

        返回

        这个电话

        test2 = "Just a test string" 
        print(self.containsSpecialCharacters(string, test2))
        

        返回

        【讨论】:

          猜你喜欢
          • 2011-01-08
          • 2010-12-17
          • 2015-09-08
          • 2012-02-18
          • 2012-05-04
          • 2020-12-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多