python字符串

字符串的相关总结

python判断字符串是否为全数字

string = '123.4500'
if string.isdigit():
    print('string是全数字字符串')
    if '.' in string:
        integer_part, decimal_part = string.split('.')
        if int(decimal_part) == 0:
            result = int(string)
        else:
            result = float(string)
else:
    print('string不是全数字字符串')

数组转字符串


arr=["dddd","ssss","dddddddddddd"]
tiaojian="---"
str_shaixuan = "|".join("%s" % tiaojian + '"' + str(i) + '"' for i in arr)
print(str_shaixuan)#---"dddd"|---"ssss"|---"dddddddddddd"

字符串模糊匹配


import difflib

config_list = ['中国工商银行', '中国农业银行', '建设银行', '中国人民银行', '招商证券', '中国农业发展银行']
query_word = '农行'

res = difflib.get_close_matches(query_word, config_list, 1, cutoff=0.1)
'''
query_word:关键字
config_list:列表
1: 返回最佳匹配个数
cutoff:定义相似度

'''

print(res)# ['中国农业银行']

利用python库:fuzzywuzzy及difflib,两个库均可实现词粒度的模糊匹配,同时可设定模糊阈值,实现关键词的提取、地址匹配、语法检查等
参考文档:https://blog.csdn.net/Lynqwest/article/details/109806055?ops_request_misc=&request_id=&biz_id=102&utm_term=difflib.get_close_matches&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-5-109806055.142^v73^insert_down3,201^v4^add_ask,239^v1^control&spm=1018.2226.3001.4187

字符串 空格, 大小写,首字母,转换大写

def str1(str):
    return (str.upper())#字符串转大写
def str2(str):
    return (str.lower())#符串转小写
def str3(str):
    return (str.capitalize())#首字母大写
def str4(str):
    return (str.isupper())#字母是否全是大写
def str5(str):
    return (str.islower())#字母是否全是小写
def str6(str):
    return (str.strip())#去掉字符串的左右空格
def str7(str):
    return (str.lstrip())#去掉字符串的左空格
def str8(str):
    return (str.rstrip())#去掉字符串的右空格
def str9(str):
    return (str.isalnum())#是否全是字母和数字,并至少有一个字符
def str10(str):
    return (str.isalpha())#是否全是字母
def str11(str):
    return (str.isdigit())#是否全是数字
def str12(str):
    return (str.isspace())#是否全是空格
def str13(str,star_str):
    return (str.startswith(star_str))#判断字符串是否以某个字符串开始
def str14(str,end_str):
    return (str.endswith(end_str))#判断字符串是否以某个字符串结束;
str="rpasssss"
star_str="ttt"
aa=str13(str,star_str)
print(aa)


数字,字母互相转换

sequence = list( map( lambda x: chr( x ), range( ord( 'A' ), ord( 'Z' ) + 1 ) ) )

##-----字母转数字(python实现 1-26=A-Z, then AA-AZ)
def ten2TwentySix(num):
    ''''
    数字转换字母,输入相应的 序列 转换对应的字母; 十进制数组, 26进制字母
    '''
    L = []
    num=num-1;  #实现从1对应A
    if num > 25:
        while True:
            d = int( num / 26 )
            remainder = num % 26
            if d <= 25:
                L.insert( 0, sequence[remainder] )
                L.insert( 0, sequence[d - 1] )
                break
            else:
                L.insert( 0, sequence[remainder] )
                num = d - 1
    else:
        L.append( sequence[num] )
    return "".join( L )


def twentySix2Ten(letter):
    '''
    字母转换数字,输入相应的字母,转换对应的数值序列
    :param s:
    :return:
    '''
    l = len(letter)
    sum = 1    #实现从A对应1
    if l > 1:
        for i in range( l - 1 ):
            index = sequence.index( letter[i] )
            print( index )
            num = pow( 26, l - 1 ) * (index + 1)
            print( num )
            l = l - 1
            sum = sum + num
        sum = sum + sequence.index( letter[-1] )
    else:
        sum = sum + sequence.index( letter[-1] )
    return sum

字符串相似度对比

import difflib
def get_equal_rate(str1, str2):
   return difflib.SequenceMatcher(None, str1, str2).quick_ratio()

字符串 量化编辑距离,可用于字符串的完全对比


'''
https://zhuanlan.zhihu.com/p/272507386
量化,编辑距离;
'''

import numpy as np

def levenshtein_distance_dp(stra, s2):
    m = len(stra) + 1
    n = len(s2) + 1
    # print(m)
    # print(n)
    dp_table = np.zeros((m,n))
    # print(dp_table)
    # 初始化
    for i in range(m):
        dp_table[i, 0] = i
    for i in range(n):
        dp_table[0, i] = i

    for i in range(1, m):
        for j in range(1, n):
            dp_table[i, j] = min(
                dp_table[i - 1, j] + 1,
                dp_table[i, j - 1] + 1,
                dp_table[i - 1, j - 1] + (1 if stra[i - 1] != s2[j - 1] else 0),
            )
    return int(dp_table[m - 2, n - 2])
# stra="你好啊我是小美"
# s2="saaaaaaaaaaaaaaaadfasdfadsfadsfadsfads"
# aa=levenshtein_distance_dp(stra, s2)
# print(aa)

判断每个字符串是否为字母 如果是字母就转大写

可以使用字符串的 isalpha() 方法判断每个字符串是否为字母,如果是字母,则使用 upper() 方法将其转换为大写。以下是示例代码:

string = 'abc123DEF456'
new_string = ''
for char in string:
    if char.isalpha():
        new_string += char.upper()
    else:
        new_string += char
print(new_string)#ABC123DEF456

还有一个方法 就是使用any()函数

s="dafAd您好/fdsaf ds "
if any(c.isalpha() for c in s):
    s = s.upper()
print(s)#DAFAD您好/FDSAF DS 

dataframe转换小写字母转换大写

dataframe里面 判断款式列中每个字符串里面是否包含字母 如果包含全部转换大写
在判断字符串是否包含字母时,应该使用 any() 函数而不是 all() 函数。因为 all() 函数只有在所有字符都是字母时才会返回 True,而 any() 函数只要有一个字符是字母就会返回 True。


import pandas as pd
# 创建示例数据
data = {'款式': ['abc123', 'DEF456', '789xyz']}
df = pd.DataFrame(data)
# 使用 apply() 方法对款式列进行操作
df['款式'] = df['款式'].apply(lambda x: x.upper() if any(char.isalpha() for char in x) else x)
# 输出结果
print(df)
'''
       款式
0  ABC123
1  DEF456
2  789XYZ
'''

否存在数字字符


str_1 = "hello"
result = any(char.isdigit() for char in str_1)
print(result)  # False
str_2 = "python3"
result = any(char.isdigit() for char in str_2)
print(result)  # True

上面的代码中,首先定义了两个字符串 str_1 和 str_2。然后使用生成器表达式判断字符串中是否存在数字字符。当字符串中至少有一个数字字符时,any() 函数返回 True,否则返回 False。在第一个示例中,字符串 str_1 中不存在数字字符,因此 any() 函数返回 False。在第二个示例中,字符串 str_2 中存在数字字符 3,因此 any() 函数返回 True。
对于 all() 函数,如果字符串中的所有字符都满足某种条件,它就会返回 True,否则返回 False。例如:

字符串中的每个字符是否都是字母


str_3 = "python"
result = all(char.isalpha() for char in str_3)
print(result)  # True
str_4 = "python3"
result = all(char.isalpha() for char in str_4)
print(result)  # False

上面的代码中,同样定义了两个字符串 str_3 和 str_4。然后使用生成器表达式判断字符串中的每个字符是否都是字母。当字符串中的所有字符都是字母时,all() 函数返回 True,否则返回 False。在第一个示例中,字符串 str_3 中所有字符都是字母,因此 all() 函数返回 True。在第二个示例中,字符串 str_4 中存在数字字符 3,因此 all() 函数返回 False。
总之,any() 和 all() 函数都可以用于字符串,只需要将字符串看作一个包含多个字符的可迭代对象即可。

字符串中 以关键字前面指定符号进行分割为两个字符串



def split_text(text, keyword,separator):
    '''

    :param text: 文本
    :param keyword: 关键字
    :param separator: 风格符
    :return:
    '''
    # 定位关键字的位置
    keyword_index = text.find(keyword)
    if keyword_index != -1:
        # 在关键字位置之前搜索最近的句号
        dot_index = text.rfind(separator, 0, keyword_index)
        if dot_index != -1:
            # 使用句号位置将文本分割为两部分
            part1 = text[:dot_index+1]
            part2 = text[dot_index+1:]
            return part1, part2
    # 如果未找到关键字或句号,则返回整个文本作为第一部分,第二部分为空字符串
    return text, ''
# 测试示例
text = "对上游端形成挤压。港口面震荡,周内现货市场表现一般。基差显弱;受制发随盘货缩量影响等,周内港口库存延续累积。后续继续随盘关注到港、烯烃项目运行等。"
keyword = "随盘"
separator = '。'
part1, part2 = split_text(text, keyword,separator)
print(part1) # 对上游端形成挤压。港口面震荡,周内现货市场表现一般。
print(part2) # 基差显弱;受制发随盘货缩量影响等,周内港口库存延续累积。后续继续随盘关注到港、烯烃项目运行等。

  目录