字符串连接
把字符串变量和字面值连接起来,组成新的字符串。推荐3个方法:
str1 = "hello"
str2 = "world"
# plan 1
print(str1 + str2)
# plan2
print("{0}{1}".format(str1, str2))
# plan2
print("".join([str1, str2]))
字符串索引与切片
对字符串进行单个字符索引时,无论是从前往后索引,还是从后往前索引,索引序号一定要在范围内,否则出错。
对字符串进行切片截取时,采用str[start:end]的方式。start,end可以正,可以负。且如果start标识的位置大于等于end标识的位置,则截取字符串为空。start,end超出字符串的极限位置,那么就用最值。start默认为0,end默认为字符串长度。
str="123456"
print(str[0]) #"1"
print(str[-1]) #"6"
print(str[0:]) #"123456"
print(str[0:1]) #"1"
print(str[0:-1]) #"12345"
print(str[0:]) #"123456"
print(str[0:100]) #"123456"
print(str[-100:100]) #"123456"
print(len(str[0:100])) #6
内置处理函数
# 大小写相关
str = "abCDef"
print(str.upper()) #ABCDEF
print(str.lower()) #abcdef
print(str.title()) #Abcdef
print(str.swapcase()) #ABcdEF
# 包含关系
print(str.startswith("ab")) #True
print(str.endswith('ef')) #True
print(str.isupper()) #False
print(str.islower()) #False
print(str.isalpha()) #True
print(str.isalnum()) #True
print(str.isdigit()) #False
str.count('ab') #1
str.find('ab') #0
str.rfind('ab') #0
# 字符切除
str.strip() #去掉首尾的空白
str.lstrip() #去掉首部空白
str.rstrip() #去掉尾部空白
str.strip('abc') #去掉首尾a、b、c字符
字符替换
str.replace('ab', 'ABG') #ABGCDef
str.replace('ab', 'ABG', 1) #ABGCDef
re.sub('ab', 'ABG', str) #ABGCDef
re.sub('[abcd]', "$", str) #$$CDef
str2 = "123df567op"
re.sub('([\d]{3})[a-z]{2}', r'\1--', str2) #123--567--
pattern = re.compile('([\d]{3})[a-z]{2}')
re.sub(pattern, r'\1--', str2) #123--567--
字符切分
# 内置函数
str='$123$sdf$d123$'
str.split('$') #['', '123', 'sdf', 'd123', '']
str.split('123') #['$', '$sdf$d', '$']
# 正则支持
re.split('\d+', str) #['$', '$sdf$d', '$']
pattern = re.compile('\d+')
re.split(pattern, str)
# 非贪婪模式
re.split('\d+?', str) #['#', '', '', '#sdf#d', '', '', '#']
应用场景示例
一般的基于文本和行字符串处理,使用sed,awk,grep等工具就可以了,这些命令行工具用起来更便捷,但是也没有python的这些函数强大。比如没法实现非贪婪模式匹配。如下:
str = 'fun("abc", 1231) + fun("def", 13)'
# 把fun的第一个参数提取出来变为大写
re.findall(r'fun\("(.*?)",.*?\)', str) #['abc', 'def']
把连续的数字提取出来,其他的字符抛弃
str = 'asb123fa#123f31'
re.split(r'[^\d]+', str) #['', '123', '123', '31']
后记
python处理字符串,比linux命令要复杂一些,功能也更强大一些。对于简单的处理任务,linux命令已经足够,python为的是一些更复杂的处理操作。如果两者都会,岂不是更好?