Check if a string is hexadecimal

后端 未结 11 1413
说谎
说谎 2020-12-13 06:14

I know the easiest way is using a regular expression, but I wonder if there are other ways to do this check.

Why do I need this? I am writing a Python script that re

相关标签:
11条回答
  • 2020-12-13 06:19

    Simple solution in case you need a pattern to validate prefixed hex or binary along with decimal

    \b(0x[\da-fA-F]+|[\d]+|0b[01]+)\b
    

    Sample: https://regex101.com/r/cN4yW7/14

    Then doing int('0x00480065006C006C006F00200077006F0072006C00640021', 0) in python gives 6896377547970387516320582441726837832153446723333914657

    The base 0 invokes prefix guessing behaviour. This has saved me a lot of hassle. Hope it helps!

    0 讨论(0)
  • 2020-12-13 06:23

    One more simple and short solution based on transformation of string to set and checking for subset (doesn't check for '0x' prefix):

    import string
    def is_hex_str(s):
        return set(s).issubset(string.hexdigits)
    

    More information here.

    0 讨论(0)
  • 2020-12-13 06:23

    This will cover the case if the string starts with '0x' or '0X': [0x|0X][0-9a-fA-F]

    d='0X12a'
    all(c in 'xX' + string.hexdigits for c in d)
    True
    
    0 讨论(0)
  • 2020-12-13 06:25

    In Python3, I tried:

    def is_hex(s):
        try:
            tmp=bytes.fromhex(hex_data).decode('utf-8')
            return ''.join([i for i in tmp if i.isprintable()])
        except ValueError:
            return ''
    

    It should be better than the way: int(x, 16)

    0 讨论(0)
  • 2020-12-13 06:26

    Most of the solutions proposed above do not take into account that any decimal integer may be also decoded as hex because decimal digits set is a subset of hex digits set. So Python will happily take 123 and assume it's 0123 hex:

    >>> int('123',16)
    291
    

    This may sound obvious but in most cases you'll be looking for something that was actually hex-encoded, e.g. a hash and not anything that can be hex-decoded. So probably a more robust solution should also check for an even length of the hex string:

    In [1]: def is_hex(s):
       ...:     try:
       ...:         int(s, 16)
       ...:     except ValueError:
       ...:         return False
       ...:     return len(s) % 2 == 0
       ...: 
    
    In [2]: is_hex('123')
    Out[2]: False
    
    In [3]: is_hex('f123')
    Out[3]: True
    
    0 讨论(0)
  • 2020-12-13 06:29

    Another option:

    def is_hex(s):
        hex_digits = set("0123456789abcdef")
        for char in s:
            if not (char in hex_digits):
                return False
        return True
    
    0 讨论(0)
提交回复
热议问题