【问题标题】:How to address/check whether a character in a string isn't a disallowed character?如何解决/检查字符串中的字符是否不是不允许的字符?
【发布时间】:2015-06-12 01:01:18
【问题描述】:

更具体地说,如果我有这样的字符串:

string = "app-_l#e"

现在,允许使用所有字母、数字、连字符和下划线;尽管其他任何字符都不是。

是否有过滤掉指定类型和/或单个字符的功能?

【问题讨论】:

    标签: python string function


    【解决方案1】:

    您可以使用str.translate 从字符串中删除允许的字符,如果字符串中只有允许的字符或禁止字符的字符串,则留下一个空字符串:

    from string import ascii_letters, digits
    
    s = "app-_l#e"
    # if the string is empty
    if not s.translate(None, "-_" + ascii_letters + digits):
        # string only contains allowed characters
    

    翻译后您的输入字符串将如下所示:

    In [7]: from string import ascii_letters, digits
    
    In [8]: s = "app-_l#e"
    
    In [9]: s.translate(None, "-_" + ascii_letters + digits)
    Out[9]: '#'
    

    或者保留一个set 的允许字符:

    from string import ascii_letters, digits
    allowed = set("-_" + ascii_letters + digits)
    s = "app-_l#e"
    if all(ch in allowed for ch in s):
         # string only contains allowed characters
    

    你想找出字符串中有哪些禁止字符,要么是print s.translate(None, "-_" + ascii_letters + digits),要么只包含任何不允许的字符,或者在for循环中迭代:

    from string import ascii_letters, digits
    allowed = set("-_" + ascii_letters + digits)
    s = "app-_l#e"
    disallowed = [ch for ch in s if ch not in allowed] 
    

    【讨论】:

    • 感谢上帝我没有添加它们,否则你将不得不重新编写所有代码:P
    • 如果您使用集合,则使用子集操作:set(s) <= allowed
    • @Suor,每次创建一个集合会比简单地检查效率低
    • 你的意思是allowed.issuperset(s)
    • @Suor:这很愚蠢;您可以像issubset 一样容易地弄错<=,并且无论哪种方式,您都可以轻松地发现并修复它。 Padraic 的重点不在于您使用哪一对运算符/方法,而在于您设置哪一个:两者中只有一个需要是一个集合,而另一个可以是任何可迭代的,并且转换 allowed 会产生更多有意义,因为您只在所有程序中执行一次,而不是每个字符串检查一次。
    【解决方案2】:

    您可以使用re,但请注意,它会更慢。

    >>> import re
    >>> pat = re.compile(r'[\d|\w|\-|_]+$')
    >>> if pat.match("app-_l#e"):
    ...     print True
    ... else:
    ...     print False
    ... 
    False
    

    还有一个匹配的例子

    >>> if pat.match("apple123_-"):
    ...     print True
    ... else:
    ...     print False
    ... 
    True
    

    【讨论】:

    • 您不需要在.match() 中使用^,它总是从头开始。最好不要使用.match(),而是使用.search()
    • 嘿@Suor,谢谢你提到这一点。使用match 的初衷是它会从一开始就发现它。但是是的 ^ 不是必需的。这是相当多余的。再次感谢您的关注。 :)
    猜你喜欢
    • 1970-01-01
    • 2018-10-22
    • 2013-10-26
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 2018-08-25
    相关资源
    最近更新 更多