How to check if a string contains only characters from a given set in python

前端 未结 6 918
梦毁少年i
梦毁少年i 2020-12-16 23:07

I have a a user-inputted polynomial and I only want to use it if it only has characters in the string 1234567890^-+x.

How can I check if it does or not

相关标签:
6条回答
  • 2020-12-16 23:48

    Yet another way to do it, now using string.translate():

    >>> import string
    >>> all_chars = string.maketrans('', '')
    >>> has_only = lambda s, valid_chars: not s.translate(all_chars, valid_chars)
    >>> has_only("abc", "1234567890^-+x.")
    False
    >>> has_only("x^2", "1234567890^-+x.")
    True
    

    It is not the most readable way. It should be one of the fastest if you need it.

    0 讨论(0)
  • 2020-12-16 23:51

    Use a regular expression:

    import re
    
    if re.match('^[-0-9^+x]*$', text):
        # Valid input
    

    The re module comes with Python 2.5, and is your fastest option.

    Demo:

    >>> re.match('^[-0-9^+x]*$', '1x2^4-2')
    <_sre.SRE_Match object at 0x10f0b6780>
    
    0 讨论(0)
  • 2020-12-16 23:53

    Here are some odd ;-) ways to do it:

    good = set('1234567890^-+x')
    
    if set(input_string) <= good:
        # it's good
    else:
        # it's bad
    

    or

    if input_string.strip('1234567890^-+x'):
        # it's bad!
    else:
        # it's good
    
    0 讨论(0)
  • 2020-12-16 23:58
    whitelist = '1234567890^-+x'
    
    str = 'x^2+2x+1'
    min([ch in whitelist for ch in str])
    True
    
    
    str='x**2 + 1' 
    min([ch in whitelist for ch in str])
    False
    
    0 讨论(0)
  • 2020-12-17 00:09
    1. You can convert the valid chars to a set, as sets offer faster lookup
    2. Then you can use all function like this

      valid_chars = set("1234567890^-+x")  # Converting to a set
      if all(char in valid_chars for char in input_string):
          # Do stuff if input is valid
      
    3. We can convert the input string also a set and check if all characters in the inputstring is in the valid list.

      valid_chars = set("1234567890^-+x")  # Converting to a set
      if set(input_string).issubset(valid_chars):
          # Do stuff if input is valid
      
    0 讨论(0)
  • 2020-12-17 00:09

    What about just convert both the string into set and checking input_set is subset of good_set as below:

    >>> good_set = set('1234567890^-+x')
    >>> input_set1 = set('xajfb123')
    >>> input_set2 = set('122-32+x')
    >>> input_set1.issubset(good_set)
    False
    >>> input_set2.issubset(good_set)
    True
    >>>
    
    0 讨论(0)
提交回复
热议问题