Module pyopt_tools.string_tools

string_tools contains functions for manipulating strings and other useful string-related functions.

Expand source code
"""
string_tools contains functions for manipulating strings and other useful string-related functions.
"""

from string import ascii_letters
from random import sample, randint

_MORSE_DECODE_DICT = {"-.-.--": "!", ".-..-.": '"', "...-..-": "$", ".-...": "&", ".----.": "\\", "-.--.": "(",
                      "-.--.-": ")", ".-.-.": "+", "--..--": ",", "-....-": "-", ".-.-.-": ".", "-..-.": "/",
                      "-----": "0", ".----": "1", "..---": "2", "...--": "3", "....-": "4", ".....": "5", "-....": "6",
                      "--...": "7", "---..": "8", "----.": "9", "---...": ":", "-.-.-.": ";", "-...-": "=",
                      "..--..": "?", ".--.-.": "@", ".-": "A", "-...": "B", "-.-.": "C", "-..": "D", ".": "E",
                      "..-.": "F", "--.": "G", "....": "H", "..": "I", ".---": "J", "-.-": "K", ".-..": "L", "--": "M",
                      "-.": "N", "---": "O", ".--.": "P", "--.-": "Q", ".-.": "R", "...": "S", "-": "T", "..-": "U",
                      "...-": "V", ".--": "W", "-..-": "X", "-.--": "Y", "--..": "Z", "..--.-": "_",
                      "...---...": "SOS"}
_MORSE_ENCODE_DICT = {'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.', 'F': '..-.', 'G': '--.', 'H': '....',
                      'I': '..', 'J': '.---', 'K': '-.-', 'L': '.-..', 'M': '--', 'N': '-.', 'O': '---', 'P': '.--.',
                      'Q': '--.-', 'R': '.-.', 'S': '...', 'T': '-', 'U': '..-', 'V': '...-', 'W': '.--', 'X': '-..-',
                      'Y': '-.--', 'Z': '--..', '1': '.----', '2': '..---', '3': '...--', '4': '....-', '5': '.....',
                      '6': '-....', '7': '--...', '8': '---..', '9': '----.', '0': '-----', ', ': '--..--',
                      '.': '.-.-.-', '?': '..--..', '/': '-..-.', '-': '-....-', '(': '-.--.', ')': '-.--.-'}


def to_binary(string: str) -> str:
    """
    Convert String to numerical binary numbers
    returns numerical binary string
    :param string: String to convert

    Example:
        >>> to_binary("test")
        >>> "1110100 1100101 1110011 1110100"
    """
    bin_conv = []
    for c in string:
        ascii_val = ord(c)
        binary_val = bin(ascii_val)
        bin_conv.append(binary_val[2:])

    return ' '.join(bin_conv)


def bin_to_text(string: str) -> str:
    """
    Convert Binary Numerical Values back to string
    returns utf-8 String
    :param string: Binary String
    :return: str

    Example:
        >>> bin_to_text("1110100 1100101 1110011 1110100")
        >>> 'test'
    """
    return "".join([chr(int(binary, 2)) for binary in string.split(" ")])


def reverse_string(string: str) -> str:
    """
    Returns a new reversed string
    :param string: String to reverse
    :return: str

    Example:
        >>> reverse_string("test")
        >>> "tset"


    """
    return string[::-1]


def encodeMorse(sequence: str) -> str:
    """
       Encodes the given string to Morse Code

       Morse code is case-insensitive and traditonally Capital Letters are used
       Lower cases are converted to Upper cases

       Every Character code is seperated by a single space between them

       A space in the sequence is translated as '   ' three spaces
    :param sequence: String to encode
    :return: str

    Example:
        >>> encodeMorse("HELLO WORLD")
        >>> ".... . .-.. .-.. ---   .-- --- .-. .-.. -.."
    """
    encoded = ''
    for letter in sequence.upper():
        if letter != ' ':
            encoded += _MORSE_ENCODE_DICT[letter] + ' '
        else:
            encoded += '  '

    return encoded.strip()


def decodeMorse(sequence: str) -> str:
    """
    Fully Decodes to Morse codes encoded using encodeMorse() to Upper Case Alphabets
    //Morse codes encoded using external encoders may raise error//
    :param sequence: String to decode
    :return: str

    Example:
        >>> decodeMorse(".... . .-.. .-.. ---   .-- --- .-. .-.. -..")
        >>> "HELLO WORLD"

    """
    return ' '.join(
        ''.join(_MORSE_DECODE_DICT[letter] for letter in word.split(' ')) for word in sequence.strip().split('   '))


def encodeCaesar(sequence: str, shift: int = 1) -> str:
    """
    Encodes the given string to Caesar Cipher
    :param sequence: String to encode
    :param shift: Shift value

    Example:
        >>> encodeCaesar("HELLO WORLD", 1)
        >>> "IFMMP XPSME"
    """
    return ''.join(chr(((ord(c) - 65 + shift) % 26) + 65) if 65 <= ord(c) <= 90 else c for c in sequence)


def decodeCaesar(sequence: str, shift: int = 1) -> str:
    """
    Decodes the given string to Caesar Cipher
    :param sequence: String to decode
    :param shift: Shift value

    Example:
        >>> decodeCaesar("IFMMP XPSME", 1)
        >>> "HELLO WORLD"
    """
    return ''.join(chr(((ord(c) - 65 - shift) % 26) + 65) if 65 <= ord(c) <= 90 else c for c in sequence)


def split_str(string: str, maxsplit: int = 1) -> list:
    """
    Splits characters of a String into List of Strings
    :param string: String to split
    :param maxsplit: It is the number of skips in character before splitting, DEFAULT = 1
    :return: Returns the Array containing elements of characters splitted from the String

    Example:
        >>> split_str("HELLO WORLD", 2)
        >>> ['He', 'll', 'o ', 'Wo', 'rl']

    """
    txt = ""
    str_list = []
    for i in string:
        txt += i
        if len(txt) == maxsplit:
            str_list.append(txt)
            txt = ''
    return str_list


def is_pangram(string: str) -> bool:
    """
    Checks if the given string is a pangram or not
    :param string: String to check
    :return: bool

    Example:
        >>> is_pangram("The quick, brown fox jumps over the lazy dog!")
        >>> True

    """
    count = 0
    for character in range(97, 123):
        if chr(character) in string or chr(character).upper() in string:
            count += 1
    if count == 26: return True
    return False


def is_palindrome(string: str) -> bool:
    """
    Checks if the given string is a palindrome or not
    :param string: String to check
    :return: bool

    Example:
        >>> is_palindrome("ABA")\n
        >>> True

    """
    if string == string[::-1]:
        return True
    return False


def is_anagram(str1: str, str2: str) -> bool:
    """
    Checks if the given string is an anagram of another string
    :param str1: String to check
    :param str2: String to check
    :return: bool

    Example:
        >>> is_anagram("waterbottle", "erbottlewat")
        >>> True

    """
    if len(str1) != len(str2):
        return False
    return sorted(str1) == sorted(str2)


def is_rotation(str1: str, str2: str) -> bool:
    """
    Checks if the given string is a rotation of another string
    :param str1: String to check
    :param str2: String to check
    :return: bool

    Example:
        >>> is_rotation("waterbottle", "erbottlewat")
        >>> True

    """
    if len(str1) != len(str2):
        return False
    return str2 in (str1 + str1)


def make_n_gram(string: str, n: int) -> list:
    """
    Creates n-grams from the given string

    :param string: Specify a input String
    :param n: Specify the n-gram size
    :return: Returns the Array containing n-grams

    Example:
        >>> make_n_gram("Hello world", 2)
        >>> ['He', 'el', 'll', 'lo', 'o ', ' w', 'wo', 'or', 'rl', 'ld']

    """
    n_grams = []
    for i in range(len(string) - n + 1):
        n_grams.append(string[i:i + n])
    return n_grams


def randomize_string(string: str) -> str:
    """
    Randomizes the given string
    :param string: String to randomize
    :return: str

    Example:
        >>> randomize_string("Hello World")
        >>> 'rldloHW'

    """
    return ''.join(sample(string, len(string)))


def get_random_color() -> str:
    """
    Returns a random hex color
    :return: str


    Example:
        >>> get_random_color()
        >>> '#ff0000'

    """
    return '#{:06x}'.format(randint(0, 0xFFFFFF))


def get_random_string(length: int) -> str:
    """
    Returns a random string of given length
    :param length: Length of the string
    :return: str

    Example:
        >>> get_random_string(10)
        >>> 'qwertzuiop'

    """
    return ''.join(sample(ascii_letters, length))


def count_vowels(string: str) -> int:
    """
    Counts the number of vowels in the given string
    :param string: String to count
    :return: int

    Example:
        >>> count_vowels("Hello World")
        >>> 3

    """
    return sum(1 for char in string if char.lower() in 'aeiou')


def count_consonants(string: str) -> int:
    """
    Counts the number of consonants in the given string
    :param string: String to count
    :return: int

    Example:
        >>> count_consonants("Hello World")
        >>> 7

    """
    return sum(1 for char in string if char.lower() in 'bcdfghjklmnpqrstvwxyz')


def count_lines(string: str) -> int:
    """
    Counts the number of lines in the given string
    :param string: String to count
    :return: int

    Example:
        >>> count_lines("Hello World")
        >>> 1

    """
    return len(string.splitlines())

Functions

def bin_to_text(string: str) ‑> str

Convert Binary Numerical Values back to string returns utf-8 String :param string: Binary String :return: str

Example

>>> bin_to_text("1110100 1100101 1110011 1110100")
>>> 'test'
Expand source code
def bin_to_text(string: str) -> str:
    """
    Convert Binary Numerical Values back to string
    returns utf-8 String
    :param string: Binary String
    :return: str

    Example:
        >>> bin_to_text("1110100 1100101 1110011 1110100")
        >>> 'test'
    """
    return "".join([chr(int(binary, 2)) for binary in string.split(" ")])
def count_consonants(string: str) ‑> int

Counts the number of consonants in the given string :param string: String to count :return: int

Example

>>> count_consonants("Hello World")
>>> 7
Expand source code
def count_consonants(string: str) -> int:
    """
    Counts the number of consonants in the given string
    :param string: String to count
    :return: int

    Example:
        >>> count_consonants("Hello World")
        >>> 7

    """
    return sum(1 for char in string if char.lower() in 'bcdfghjklmnpqrstvwxyz')
def count_lines(string: str) ‑> int

Counts the number of lines in the given string :param string: String to count :return: int

Example

>>> count_lines("Hello World")
>>> 1
Expand source code
def count_lines(string: str) -> int:
    """
    Counts the number of lines in the given string
    :param string: String to count
    :return: int

    Example:
        >>> count_lines("Hello World")
        >>> 1

    """
    return len(string.splitlines())
def count_vowels(string: str) ‑> int

Counts the number of vowels in the given string :param string: String to count :return: int

Example

>>> count_vowels("Hello World")
>>> 3
Expand source code
def count_vowels(string: str) -> int:
    """
    Counts the number of vowels in the given string
    :param string: String to count
    :return: int

    Example:
        >>> count_vowels("Hello World")
        >>> 3

    """
    return sum(1 for char in string if char.lower() in 'aeiou')
def decodeCaesar(sequence: str, shift: int = 1) ‑> str

Decodes the given string to Caesar Cipher :param sequence: String to decode :param shift: Shift value

Example

>>> decodeCaesar("IFMMP XPSME", 1)
>>> "HELLO WORLD"
Expand source code
def decodeCaesar(sequence: str, shift: int = 1) -> str:
    """
    Decodes the given string to Caesar Cipher
    :param sequence: String to decode
    :param shift: Shift value

    Example:
        >>> decodeCaesar("IFMMP XPSME", 1)
        >>> "HELLO WORLD"
    """
    return ''.join(chr(((ord(c) - 65 - shift) % 26) + 65) if 65 <= ord(c) <= 90 else c for c in sequence)
def decodeMorse(sequence: str) ‑> str

Fully Decodes to Morse codes encoded using encodeMorse() to Upper Case Alphabets //Morse codes encoded using external encoders may raise error// :param sequence: String to decode :return: str

Example

>>> decodeMorse(".... . .-.. .-.. ---   .-- --- .-. .-.. -..")
>>> "HELLO WORLD"
Expand source code
def decodeMorse(sequence: str) -> str:
    """
    Fully Decodes to Morse codes encoded using encodeMorse() to Upper Case Alphabets
    //Morse codes encoded using external encoders may raise error//
    :param sequence: String to decode
    :return: str

    Example:
        >>> decodeMorse(".... . .-.. .-.. ---   .-- --- .-. .-.. -..")
        >>> "HELLO WORLD"

    """
    return ' '.join(
        ''.join(_MORSE_DECODE_DICT[letter] for letter in word.split(' ')) for word in sequence.strip().split('   '))
def encodeCaesar(sequence: str, shift: int = 1) ‑> str

Encodes the given string to Caesar Cipher :param sequence: String to encode :param shift: Shift value

Example

>>> encodeCaesar("HELLO WORLD", 1)
>>> "IFMMP XPSME"
Expand source code
def encodeCaesar(sequence: str, shift: int = 1) -> str:
    """
    Encodes the given string to Caesar Cipher
    :param sequence: String to encode
    :param shift: Shift value

    Example:
        >>> encodeCaesar("HELLO WORLD", 1)
        >>> "IFMMP XPSME"
    """
    return ''.join(chr(((ord(c) - 65 + shift) % 26) + 65) if 65 <= ord(c) <= 90 else c for c in sequence)
def encodeMorse(sequence: str) ‑> str

Encodes the given string to Morse Code

Morse code is case-insensitive and traditonally Capital Letters are used Lower cases are converted to Upper cases

Every Character code is seperated by a single space between them

A space in the sequence is translated as ' ' three spaces :param sequence: String to encode :return: str

Example

>>> encodeMorse("HELLO WORLD")
>>> ".... . .-.. .-.. ---   .-- --- .-. .-.. -.."
Expand source code
def encodeMorse(sequence: str) -> str:
    """
       Encodes the given string to Morse Code

       Morse code is case-insensitive and traditonally Capital Letters are used
       Lower cases are converted to Upper cases

       Every Character code is seperated by a single space between them

       A space in the sequence is translated as '   ' three spaces
    :param sequence: String to encode
    :return: str

    Example:
        >>> encodeMorse("HELLO WORLD")
        >>> ".... . .-.. .-.. ---   .-- --- .-. .-.. -.."
    """
    encoded = ''
    for letter in sequence.upper():
        if letter != ' ':
            encoded += _MORSE_ENCODE_DICT[letter] + ' '
        else:
            encoded += '  '

    return encoded.strip()
def get_random_color() ‑> str

Returns a random hex color :return: str

Example

>>> get_random_color()
>>> '#ff0000'
Expand source code
def get_random_color() -> str:
    """
    Returns a random hex color
    :return: str


    Example:
        >>> get_random_color()
        >>> '#ff0000'

    """
    return '#{:06x}'.format(randint(0, 0xFFFFFF))
def get_random_string(length: int) ‑> str

Returns a random string of given length :param length: Length of the string :return: str

Example

>>> get_random_string(10)
>>> 'qwertzuiop'
Expand source code
def get_random_string(length: int) -> str:
    """
    Returns a random string of given length
    :param length: Length of the string
    :return: str

    Example:
        >>> get_random_string(10)
        >>> 'qwertzuiop'

    """
    return ''.join(sample(ascii_letters, length))
def is_anagram(str1: str, str2: str) ‑> bool

Checks if the given string is an anagram of another string :param str1: String to check :param str2: String to check :return: bool

Example

>>> is_anagram("waterbottle", "erbottlewat")
>>> True
Expand source code
def is_anagram(str1: str, str2: str) -> bool:
    """
    Checks if the given string is an anagram of another string
    :param str1: String to check
    :param str2: String to check
    :return: bool

    Example:
        >>> is_anagram("waterbottle", "erbottlewat")
        >>> True

    """
    if len(str1) != len(str2):
        return False
    return sorted(str1) == sorted(str2)
def is_palindrome(string: str) ‑> bool

Checks if the given string is a palindrome or not :param string: String to check :return: bool

Example

>>> is_palindrome("ABA")
>>> True
Expand source code
def is_palindrome(string: str) -> bool:
    """
    Checks if the given string is a palindrome or not
    :param string: String to check
    :return: bool

    Example:
        >>> is_palindrome("ABA")\n
        >>> True

    """
    if string == string[::-1]:
        return True
    return False
def is_pangram(string: str) ‑> bool

Checks if the given string is a pangram or not :param string: String to check :return: bool

Example

>>> is_pangram("The quick, brown fox jumps over the lazy dog!")
>>> True
Expand source code
def is_pangram(string: str) -> bool:
    """
    Checks if the given string is a pangram or not
    :param string: String to check
    :return: bool

    Example:
        >>> is_pangram("The quick, brown fox jumps over the lazy dog!")
        >>> True

    """
    count = 0
    for character in range(97, 123):
        if chr(character) in string or chr(character).upper() in string:
            count += 1
    if count == 26: return True
    return False
def is_rotation(str1: str, str2: str) ‑> bool

Checks if the given string is a rotation of another string :param str1: String to check :param str2: String to check :return: bool

Example

>>> is_rotation("waterbottle", "erbottlewat")
>>> True
Expand source code
def is_rotation(str1: str, str2: str) -> bool:
    """
    Checks if the given string is a rotation of another string
    :param str1: String to check
    :param str2: String to check
    :return: bool

    Example:
        >>> is_rotation("waterbottle", "erbottlewat")
        >>> True

    """
    if len(str1) != len(str2):
        return False
    return str2 in (str1 + str1)
def make_n_gram(string: str, n: int) ‑> list

Creates n-grams from the given string

:param string: Specify a input String :param n: Specify the n-gram size :return: Returns the Array containing n-grams

Example

>>> make_n_gram("Hello world", 2)
>>> ['He', 'el', 'll', 'lo', 'o ', ' w', 'wo', 'or', 'rl', 'ld']
Expand source code
def make_n_gram(string: str, n: int) -> list:
    """
    Creates n-grams from the given string

    :param string: Specify a input String
    :param n: Specify the n-gram size
    :return: Returns the Array containing n-grams

    Example:
        >>> make_n_gram("Hello world", 2)
        >>> ['He', 'el', 'll', 'lo', 'o ', ' w', 'wo', 'or', 'rl', 'ld']

    """
    n_grams = []
    for i in range(len(string) - n + 1):
        n_grams.append(string[i:i + n])
    return n_grams
def randomize_string(string: str) ‑> str

Randomizes the given string :param string: String to randomize :return: str

Example

>>> randomize_string("Hello World")
>>> 'rldloHW'
Expand source code
def randomize_string(string: str) -> str:
    """
    Randomizes the given string
    :param string: String to randomize
    :return: str

    Example:
        >>> randomize_string("Hello World")
        >>> 'rldloHW'

    """
    return ''.join(sample(string, len(string)))
def reverse_string(string: str) ‑> str

Returns a new reversed string :param string: String to reverse :return: str

Example

>>> reverse_string("test")
>>> "tset"
Expand source code
def reverse_string(string: str) -> str:
    """
    Returns a new reversed string
    :param string: String to reverse
    :return: str

    Example:
        >>> reverse_string("test")
        >>> "tset"


    """
    return string[::-1]
def split_str(string: str, maxsplit: int = 1) ‑> list

Splits characters of a String into List of Strings :param string: String to split :param maxsplit: It is the number of skips in character before splitting, DEFAULT = 1 :return: Returns the Array containing elements of characters splitted from the String

Example

>>> split_str("HELLO WORLD", 2)
>>> ['He', 'll', 'o ', 'Wo', 'rl']
Expand source code
def split_str(string: str, maxsplit: int = 1) -> list:
    """
    Splits characters of a String into List of Strings
    :param string: String to split
    :param maxsplit: It is the number of skips in character before splitting, DEFAULT = 1
    :return: Returns the Array containing elements of characters splitted from the String

    Example:
        >>> split_str("HELLO WORLD", 2)
        >>> ['He', 'll', 'o ', 'Wo', 'rl']

    """
    txt = ""
    str_list = []
    for i in string:
        txt += i
        if len(txt) == maxsplit:
            str_list.append(txt)
            txt = ''
    return str_list
def to_binary(string: str) ‑> str

Convert String to numerical binary numbers returns numerical binary string :param string: String to convert

Example

>>> to_binary("test")
>>> "1110100 1100101 1110011 1110100"
Expand source code
def to_binary(string: str) -> str:
    """
    Convert String to numerical binary numbers
    returns numerical binary string
    :param string: String to convert

    Example:
        >>> to_binary("test")
        >>> "1110100 1100101 1110011 1110100"
    """
    bin_conv = []
    for c in string:
        ascii_val = ord(c)
        binary_val = bin(ascii_val)
        bin_conv.append(binary_val[2:])

    return ' '.join(bin_conv)