VWED_server/utils/string_utils/string_functions.py

352 lines
8.2 KiB
Python
Raw Permalink Normal View History

2025-04-30 16:57:46 +08:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
字符串工具函数
提供各种字符串操作的实用函数
所有函数均为异步实现
"""
import re
from typing import List, Optional, Union
async def is_blank(s: Optional[str]) -> bool:
"""
检查字符串是否为None空字符串或只包含空白字符
Args:
s: 要检查的字符串
Returns:
bool: 如果字符串为None空字符串或只包含空白字符则返回True否则返回False
"""
return s is None or (isinstance(s, str) and s.strip() == "")
async def is_not_blank(s: Optional[str]) -> bool:
"""
检查字符串是否不为空不为None且不只包含空白字符
Args:
s: 要检查的字符串
Returns:
bool: 如果字符串不为None且不只包含空白字符则返回True否则返回False
"""
return not await is_blank(s)
async def is_any_blank(*strings: Optional[str]) -> bool:
"""
检查是否有任何一个字符串为空
Args:
*strings: 要检查的字符串列表
Returns:
bool: 如果任何一个字符串为空则返回True否则返回False
"""
for s in strings:
if await is_blank(s):
return True
return False
async def is_all_blank(*strings: Optional[str]) -> bool:
"""
检查是否所有字符串都为空
Args:
*strings: 要检查的字符串列表
Returns:
bool: 如果所有字符串都为空则返回True否则返回False
"""
for s in strings:
if not await is_blank(s):
return False
return True
async def is_numeric(s: Optional[str]) -> bool:
"""
检查字符串是否为数字整数或浮点数
Args:
s: 要检查的字符串
Returns:
bool: 如果字符串是数字则返回True否则返回False
"""
if await is_blank(s):
return False
try:
float(s)
return True
except (ValueError, TypeError):
return False
async def is_alpha(s: Optional[str]) -> bool:
"""
检查字符串是否只包含字母
Args:
s: 要检查的字符串
Returns:
bool: 如果字符串只包含字母则返回True否则返回False
"""
if await is_blank(s):
return False
return isinstance(s, str) and s.isalpha()
async def starts_with(s: Optional[str], prefix: str) -> bool:
"""
检查字符串是否以指定前缀开头
Args:
s: 要检查的字符串
prefix: 前缀字符串
Returns:
bool: 如果字符串以指定前缀开头则返回True否则返回False
"""
if await is_blank(s):
return False
return isinstance(s, str) and s.startswith(prefix)
async def ends_with(s: Optional[str], suffix: str) -> bool:
"""
检查字符串是否以指定后缀结尾
Args:
s: 要检查的字符串
suffix: 后缀字符串
Returns:
bool: 如果字符串以指定后缀结尾则返回True否则返回False
"""
if await is_blank(s):
return False
return isinstance(s, str) and s.endswith(suffix)
async def contains(s: Optional[str], sub: str) -> bool:
"""
检查字符串是否包含指定子字符串
Args:
s: 要检查的字符串
sub: 子字符串
Returns:
bool: 如果字符串包含指定子字符串则返回True否则返回False
"""
if await is_blank(s):
return False
return isinstance(s, str) and sub in s
async def split(s: Optional[str], sep: str, maxsplit: int = -1) -> List[str]:
"""
按指定分隔符拆分字符串
Args:
s: 要拆分的字符串
sep: 分隔符
maxsplit: 最大拆分次数默认为-1无限制
Returns:
List[str]: 拆分后的字符串列表
"""
if await is_blank(s):
return []
return s.split(sep, maxsplit)
async def chop(s: Optional[str]) -> str:
"""
去掉字符串的最后一个字符
Args:
s: 要处理的字符串
Returns:
str: 处理后的字符串如果原字符串为空则返回空字符串
"""
if await is_blank(s):
return ""
return s[:-1]
async def chomp(s: Optional[str]) -> str:
"""
去掉字符串末尾的换行符\\n\\r \\r\\n
Args:
s: 要处理的字符串
Returns:
str: 处理后的字符串如果原字符串为空则返回空字符串
"""
if await is_blank(s):
return ""
if s.endswith("\r\n"):
return s[:-2]
if s.endswith("\n") or s.endswith("\r"):
return s[:-1]
return s
async def index_of(s: Optional[str], sub: str, start: int = 0, end: Optional[int] = None) -> int:
"""
查找子字符串在字符串中的索引位置
Args:
s: 要搜索的字符串
sub: 要查找的子字符串
start: 开始搜索的位置默认为0
end: 结束搜索的位置默认为None搜索到字符串末尾
Returns:
int: 子字符串在字符串中的索引位置如果找不到则返回-1
"""
if await is_blank(s) or await is_blank(sub):
return -1
try:
return s.index(sub, start, end) if end else s.index(sub, start)
except ValueError:
return -1
async def difference(str1: Optional[str], str2: Optional[str]) -> str:
"""
获取第二个字符串在第一个字符串中不一样的部分
从第二个字符串第一位去匹配第一个字符串按照顺序比较
Args:
str1: 第一个字符串
str2: 第二个字符串
Returns:
str: 不一样的部分如果任一字符串为空或无差异则返回空字符串
"""
if await is_blank(str1) or await is_blank(str2):
return ""
# 找到共同前缀的长度
i = 0
min_len = min(len(str1), len(str2))
while i < min_len and str1[i] == str2[i]:
i += 1
# 如果第二个字符串比第一个短,或者完全匹配,则返回空字符串
if i >= len(str2):
return ""
# 返回不同的部分
return str2[i:]
async def replace(s: Optional[str], old: str, new: str, count: int = -1) -> str:
"""
替换字符串中的指定子串
Args:
s: 原字符串
old: 要替换的子串
new: 替换后的子串
count: 替换次数默认为-1全部替换
Returns:
str: 替换后的字符串
"""
if await is_blank(s):
return ""
return s.replace(old, new, count)
async def remove(s: Optional[str], sub: str) -> str:
"""
从字符串中删除所有指定的子串
Args:
s: 原字符串
sub: 要删除的子串
Returns:
str: 删除后的字符串
"""
return await replace(s, sub, "")
async def right(s: Optional[str], length: int) -> str:
"""
从右边获取指定长度的子字符串
Args:
s: 原字符串
length: 要获取的长度
Returns:
str: 截取的子字符串
"""
if await is_blank(s):
return ""
if length <= 0:
return ""
if length >= len(s):
return s
return s[-length:]
async def left(s: Optional[str], length: int) -> str:
"""
从左边获取指定长度的子字符串
Args:
s: 原字符串
length: 要获取的长度
Returns:
str: 截取的子字符串
"""
if await is_blank(s):
return ""
if length <= 0:
return ""
return s[:length]
async def length(s: Optional[str]) -> int:
"""
获取字符串的长度
Args:
s: 要测量的字符串
Returns:
int: 字符串的长度如果为None则返回0
"""
if s is None:
return 0
return len(s)
async def reverse(s: Optional[str]) -> str:
"""
反转字符串
Args:
s: 要反转的字符串
Returns:
str: 反转后的字符串
"""
if await is_blank(s):
return ""
return s[::-1]