47 lines
1.3 KiB
Python
47 lines
1.3 KiB
Python
"""General shared utilities."""
|
|
import logging
|
|
import re
|
|
from itertools import tee, zip_longest
|
|
from typing import Any, Iterable, Tuple
|
|
|
|
# Do not update the version manually - it is managed by `bumpversion`.
|
|
log = logging.getLogger(__name__)
|
|
|
|
#: Regular expression for stripping non-alphanumeric characters
|
|
NON_ALPHANUMERIC_STRIP_RE = re.compile(r'[\W_]+')
|
|
|
|
|
|
def is_blank(string: str) -> bool:
|
|
"""Return True iff the string contains only whitespaces."""
|
|
return not string.strip()
|
|
|
|
|
|
def pairwise(
|
|
iterable: Iterable,
|
|
default_value: Any,
|
|
) -> Iterable[Tuple[Any, Any]]:
|
|
"""Return pairs of items from `iterable`.
|
|
|
|
pairwise([1, 2, 3], default_value=None) -> (1, 2) (2, 3), (3, None)
|
|
"""
|
|
a, b = tee(iterable)
|
|
_ = next(b, default_value)
|
|
return zip_longest(a, b, fillvalue=default_value)
|
|
|
|
|
|
def common_prefix_length(a: str, b: str) -> int:
|
|
"""Return the length of the longest common prefix of a and b.
|
|
|
|
>>> common_prefix_length('abcd', 'abce')
|
|
3
|
|
|
|
"""
|
|
for common, (ca, cb) in enumerate(zip(a, b)):
|
|
if ca != cb:
|
|
return common
|
|
return min(len(a), len(b))
|
|
|
|
|
|
def strip_non_alphanumeric(string: str) -> str:
|
|
"""Strip string from any non-alphanumeric characters."""
|
|
return NON_ALPHANUMERIC_STRIP_RE.sub('', string)
|