Python 3(4)数据类型:字符串 & 正则表达式

时间:2021-03-26 18:47:19

Python3 入门专栏

http://blog.csdn.net/column/details/19679.html


字符串定义

python 可以使用 ' ' 或 " " 来指定一个字符串,这两种符号的含义完全相同(不像 PHP 等会有字面量引用和解析引用的区别), 字符串会按字面意义级联字符串;;
 
# 以下 4 个变量值相同
str1 = 'This is a String'
str2 = "This is a String"
str3 = "This"" is"" a"" String"
str4 = "This" + " is" + " a" + " String"
可以使用三引号 """ """ 或 ''' '''来指定一个跨行字符串(该字符串输出时会保留跨行格式);
 
str3 = """This is paragraph 1
This is paragraph 2 """
如上str3 输出时,会输出以下:
This is paragraph 1
This is paragraph 2

转义字符表

python 使用 \ 作为转义符,转义字符表如下:

符号 含义 符号 含义 符号 含义 符号 含义
\(在行尾时) 续行符 \\ 反斜杠 \' 单引号 \'' 双引号
\a 响铃 \b 退格 \n 换行 \e 转义
\f 换页 \r 回车 \v 纵向制表符 \t 横向制表符
\000 \oyy 八进制数,yy表示八进制书 \xyy 十六进制数,,yy表示十六进制书 \other 其他字符以普通格式输出

 如果需要按字面量赋值字符串,可以通过在字符串前加 r 或 R,如下:

string = r"are you ok?\n"
print(string)    # 输出:are you ok?\n ,此时 \n 不会被转义





字符串常用操作

拼接字符串
字符串使用  + 作为连接符 ,使用  * 作为重复操作符;
 
str1 = "Hello"
str2 = " World"
concat = str1 + str2   # concat = "Hello World"
repeat = str1 *2       # repeat = "HelloHello"

获取字符串长度
可以通过 len() 函数获取字符串的长度:
 
string = "Are you OK?"
print(len(string))    # 输出 11

访问子字符串值
与 C 类似,python 字符串可以通过 方括号 [ ] 来访问子字符串,如下:
 
var = "Hello World!"
print(var[0])    # 访问var第0个字符:H
print(var[-1])   # 访问var的最后一个字符:!
print(var[1:4])  # 访问var第1到第3个字符:ell
print(var[:4])   # 访问var第0到第4个字符:Hell
print(var[6:])   # 访问var第6到最后一个字符:World!
※ python 字符串是不可以改变的,向一个索引位置赋值会导致错误,如 var[0] = "E"会引起错误;

判断字符串是否包含子串
可以通过 in / not in 判断一个元素是否在一个字符串中:
 
string = "Are you OK?"
print('O' in string)       # 输出 True
print('A' not in string )  # 输出 False

字符串遍历
 
string = "Are you OK?"
for ch in string:
    print(ch)
# 或
for i in range(len(string)):
    print(string[i])




字符串格式化

python 中,字符串格式化使用与 C 的 sprintf() 、Java 的 String.format 用法类似,使用如 %s,%d 的格式化符号,语法如下:
 
含有格式化占位符的字符串 % (占位符参数1, 占位符参数2,....)
示例:
 
message = "今天 %s 的空气指数为:%.2f" % ("广州", 147)
print(message)   # 输出:今天 广州 的空气指数为:147.00
python字符串格式化符号如下:
符号 说明 符号 说明
 %c  格式化字符及其ASCII码  %s  格式化字符串
 %d  格式化整数  %u  格式化无符号整型
 %o  格式化无符号八进制数  %x / %X   格式化无符号十六进制数(小写,大写)
  %f,%F  格式化浮点数字,可指定小数点后的精度 %e,%E  用科学计数法格式化浮点数
 %g, %G  %f和%e的简写  %p  用十六进制数格式化变量的地址

 格式化操作符辅助指令:


* 定义宽度或者小数点精度
- 用做左对齐
+ 在正数前面显示加号( + )
<sp> 在正数前面显示空格
# 在八进制数前面显示零('0'),在十六进制前面显示'0x'或者'0X'(取决于用的是'x'还是'X')
0 显示的数字前面填充'0'而不是默认的空格
% '%%'输出一个单一的'%'
(var) 映射变量(字典参数)
m.n. m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话)

 




字符串常用内建函数

字符串信息获取
len(string) 返回字符串长度
count(str [, beg=?,end=?]) 返回 str 在 string 里面出现的次数,beg,end用于指定查找的起点和终点
startswith(prefix [, beg=?, end=?]) 检测 string 是否以 profix 为开始 
endswith(suffix [, beg=?, end=?]) 检测 string 是否以 suffix 为结尾
find(str[, beg=? end=?])  检测 str 是否包含在字符串中,同 index() 函数,但是 str 不在 string 中时 index() 会抛出一个异常
rfind(str, beg=0,end=len(string)) 类似于 find()函数,不过是从右边开始查找.
字符串操作
replace(oldStr, newStr [, max]) 把 将字符串中的 str1 替换成 str2,如果 max 指定,则替换不超过 max 次。
join(seq) 以指定字符串作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
split(strSpilt [, num=string.count(str)]) 以 strSplit 为分隔符截取字符串,如果 num 有指定值,则仅截取 num 个子字符串
strip([chars]) 删除 string 前后的空格字符,可以通过 chars 执行删除字符列表
lower() 转换字符串中所有大写字符为小写.
upper() 转换字符串中的小写字母为大写
title() 返回"标题化"的字符串,就是说所有单词都是以大写开始,其余字母均为小写
center(width [, fillchar]) 返回一个指定的宽度 width 居中的字符串,fillchar 为填充的字符,默认为空格。
expandtabs( tabsize=8 ) 把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是 8 
encode(encoding='UTF-8' [,errors='strict']) 以 encoding 指定的编码格式编码字符串,如果出错默认报一个ValueError 的异常,除非 errors 指定的是'ignore'或者'replace'
bytes.decode(encoding="utf-8" [, errors="strict"]) 使用 bytes 对象的 decode() 方法来解码给定的 bytes 对象,这个 bytes 对象可以由 str.encode() 来编码返回。
字符串检验
isalnum() 如果字符串至少有一个字符并且所有字符都是字母或数字则返 回 True,
isalpha() 如果字符串至少有一个字符并且所有字符都是字母则返回 True
isdigit() 如果字符串只包含数字则返回 True
isspace() 如果字符串中只包含空白,则返回 True
islower() 如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True
isupper() 如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True

 


正则表达式匹配

python 支持 Perl 风格的正则表达式匹配,提供了 re 模块用于支持相关功能;

正则匹配

re.match() 和 re.search() 都可以用于进行正则匹配,它们的方法签名如下:
 
re.search(pattern, string, flags)
re.match(pattern, string, flags)
  • pattern :匹配的正则表达式;
  • string : 要匹配的字符串;
  • flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。默认为空,
标志位的候选参数如下:
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。


当匹配成功时,会返回一个结果对象,匹配失败时会返回 None;
对于匹配的结果对象,可以使用 group(index) / groups() 来获取匹配子串,使用 span(index) 来获取匹配子串下标范围;

re.match() 和 re.search()  的区别如下:
  • re.search():完全匹配整个个字符串,贪婪模式匹配;
  • re.match() :从开始匹配字符串,相当于使用了 ^pattern ;
示例:
 
import re
url = "https://www.google.com"
# 匹配 url 的协议
result1 = re.search(r"^(\w+)://", url)
if result1:
    print(result1.group(1))   # 返回匹配的第1个子串,输出:https
    print(result1.span(1))    # 返回匹配的第1个子串的下标范围,输出:(0, 5)
# 匹配 HTTP url *域名
result2 = re.search(r"\.(\w+)$", url)
if result2:
    print(result2.group(1))  # 输出:com
    print(result2.span(1))   # 输出:(19, 22)

正则替换

re模块提供了re.sub用于替换字符串中的匹配项,方法签名如下:
 
re.sub(pattern, repl, string, count=0)
  • pattern : 正则中的模式字符串;
  • repl : 替换的字符串,也可为一个函数;
  • string : 要被查找替换的原始字符串;
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配;

示例:
 
import re
greeting = "Are you fuck ok ? The weather is fuck nice today ! Mother fuck!"
# 将 greeting 中的所有 fuck 都更换为 ***
result = re.sub(r"\b(fuck)\b", "***", greeting)
print(result) 
# 输出:Are you *** ok ? The weather is *** nice today ! Mother ***!