大家好,今天小编来为大家解答以下的问题,关于第二章:文本处理与字符串操作基础,这个很多人还不知道,现在让我们一起来看看吧!
答:字符串对象的split() 方法只能处理非常简单的情况,并且不支持多个分隔符,也不能对分隔符周围可能存在的空格做任何事情。但你可以使用re.split()
行="asdf fdjk; afed fjd、askjf、foo"
进口重新
re.split(r"[;s]s*",line)
2.在字符串的开头或者结尾处做文本匹配
问题:我们需要检查字符串开头或结尾的指定文本模式,例如检查文件扩展名和url 协议类型等;
解决方案:有一个简单的方法来检查字符串的开头或结尾:
开始()和结束()
如果您要检查和过滤列表字符串,则可以使用列表推导式;
if any(name.endswith((".c",".h")) for name in listdir(dirname)):
3.利用shell通配符做字符串匹配
4.文本模式的匹配和查找
如果只想匹配简单文本,通常只需要使用基本字符串方法,例如:str.find()、str.endswith()、str.startswith()或类似函数;
text="年份,但是没有,但是是的,但是bo,但是是的"
text.startswith("是的") #True
text.endswith("no") #False
text.find("no") #10对于更复杂的匹配,需要使用正则表达式和RE模块:
文本1="11/27/2017"
进口重新
if re.match(r"d+/d+/d+",text):
print("yes")match() 方法总是尝试在字符串的开头查找匹配项。如果您想搜索整个文本的所有匹配项,您应该使用findall() 方法;
findall() 方法搜索整个文本并找到所有匹配项并以列表的形式返回它们。如果你想迭代地查找匹配项,可以使用finditer() 方法;
text="今天是11/27/2017。 pcCon 于2015 年3 月13 日开始"
datepat=re.compile(r"d+/d+/d+")
datepat.findall(text) 定义正则表达式时,我们经常通过将模式的一部分括在括号中来将其引入捕获组中。
datapat=re.compile(r"(d+)/(d+)/(d+)")
捕获组通常会简化匹配结果的后续处理,因为可以单独提取每个组的内容;
5.查找和替换文本
问题:我们想要查找并替换字符串的文本
解决方案:对于简单文本模式,使用str.replace();
text="今天是11/27/2017。 pcCon 于2015 年3 月13 日开始"
text.replace("yeah","yep") 对于更复杂的模式,可以使用re 模块中的sub() 函数方法。为了说明如何使用它,假设我们要将日期格式从“11/27/2017”更改为“2017-11-27”:
text="今天是11/27/2017。 pcCon 于2015 年3 月13 日开始"
re.sub(r"(d+)/(d+)/(d+)",r"3-1-2",text) sub() 的第一个参数是要匹配的模式。第二个参数是要替换的模式。反斜杠加数字符号(如“3”)表示模式中捕获组的数量;
如果您打算使用相同的模式执行重复替换,请考虑首先编译该模式以获得更好的性能;
进口重新
datepat=re.compile(r"(d+)/(d+)/(d+)")
datepat.sub(r"3-1-2",文本)
"Today is 2017-11-27.pcConstarts 2015-3-13" 除了获取替换的文本之外,如果还想知道已经完成了多少替换,可以使用re.subn()。
newtext ,n=datepat.subn(r"3-1-2",文本)
新文本
"今天是2017 年11 月27 日。pcCon 于2015 年3 月13 日开始"
n
2
6.以不区分大小写的方式对文本做查找和替换
问题:我们需要以不区分大小写的方式在文本中查找并可能替换
解决方案:要进行不区分大小写的文本操作,需要使用re模块,在各种操作中添加re.IGNORECASE标签;
修饰符说明re.I 使匹配不区分大小写re.L 进行本地化识别(区域设置感知)匹配re.M 多行匹配,影响^ 和$re.S 使.匹配包括换行符在内的所有字符。re.U根据Unicode字符集解析字符。该标志影响w、W、b、B.re。匹配文本模式时,会识别最长的可能匹配。相反,我们要修改它以找到尽可能短的匹配;
解决方案:模式:r"(.)" 尝试匹配用引号引起来的文本。然而,正则表达式中的运算符是贪婪的,因此匹配过程基于寻找最长的可能匹配。要解决这个问题,只需添加?在模式中的运算符之后?修饰符就可以了;==r"(.)"
7.定义实现最短匹配的正则表达式
8.编写多行模式的正则表达式
9.将Unicode文本统一为规范形式
10.用正则表达式处理Unicode字符;
问题:我们想从字符串的开头、结尾或中间删除不必要的字符,例如空格;
解决方案: strip() 方法可用于删除字符串开头或结尾的字符。 lstrip() 和rstrip() 分别从左侧和右侧开始删除字符。默认情况下,这些方法会删除空格,但也可以指定字符;
str.strip() #默认去除空格
str.strip("/") #删除指定字符。上述操作只能去除字符串开头或结尾的字符,对于字符串中间的指定字符不起作用;如果要对里面的空格进行某种操作,对于某些操作,应该使用其他技术,例如正则表达式或replace()方法;
s.replace(" ","")
re.sub("s+","",s)
11.从字符串中去掉不需要的字符
12.文本过滤和清理
问题:我们需要以某种对齐方式格式化文本
解决方案:对于基本的字符串对齐要求,可以使用字符串的ljust()、rjust()和center()方法。
文本="你好世界"
文本.ljust(2)
"你好世界"
文本.ljust(20)
"你好世界"
文本.rjust(20)
"你好世界"
文本中心(20)
"你好世界"
text.rjust(20,"=")
"==========你好世界"
文本.ljust(20,"=")
"你好世界========="
文本.center(20,"=")
"====你好世界====="
format()函数也可以用来轻松完成对齐任务。您所需要做的就是合理使用“”、“”或“^”字符串以及所需的宽度值
格式(文本,"20")
"你好世界"
格式(文本,"20")
"你好世界"
格式(文本,"^20")
"你好世界
格式(文本,"*^20")
"****你好世界*****"
格式(文本,"*20")
"Hello world*********"
13.对其文本字符串
问题:我们想要将许多小字符串合并为一个大字符串;
解决方案:如果要合并的字符串位于序列或可迭代对象中,最快的合并方法是使用join() 方法;
parts=["是","芝加哥","不是","芝加哥?"]
" ".join(部分)
“芝加哥不是芝加哥吗?”对于多个字符串的简单串联,可以直接使用“+”运算符;
a="是芝加哥"
b="不是芝加哥?"
a + " " + b
“芝加哥不是芝加哥吗?”对于更负责任的字符串格式化操作,+运算符也可以用作format()的替代,
print("{} {}".format(a,b))
芝加哥不是芝加哥吗?当列表中的格式不统一时;我们需要在join() 之前处理它
数据=["ACME",50,91.1]
",".join(数据)
回溯(最近一次调用):
文件“”,第1 行,inTypeError: 序列项1: 预期str 实例,找到int
",".join(str(d) for d in data)
"ACME,50,91.1"
14.字符串链接和合并
问题:我想创建一个字符串,其中嵌入的变量名称替换为变量的字符串值;
解决方案:Python不支持字符串中变量的简单值替换,但是可以通过字符串的format()方法来近似模拟这个功能;
s="{name} 有{n} 条消息。"
s.format(name="overad",n=37)
“overad 有37 条消息。”两种方式:如果变量中确实可以找到要替换的值,则可以一起使用format_map()和vars()。示例如下:
名称="overad"
n=33
s.format_map(vars())
“overad 有33 条消息。”以上两种方法都无法优雅地处理缺失值;避免这种情况的一种方法是使用missing() 方法定义一个单独的类,
类safesub(dict):
. def __missing__(self,key):
.返回"{" + 键+ "}"
.
德尔恩
s.format_map(safesub(vars()))
“overad 有{n} 条消息。”如果您发现自己经常需要在代码中执行这些步骤,您可以将替换变量的过程隐藏在一个小函数中;
导入系统
def 子(文本):
.返回text.format_map(safesub(sys._getframe(1).f_locals))
.
名称="overad"
人数=37
print(sub("你好{name}"))
你好,过度
print(sub("您有{n} 条消息。"))
您有37 条消息。
print("你最喜欢的颜色是{color}")
你最喜欢的颜色是{color}
15.给字符串中的变量名做插值处理
问题:我们有一些很长的字符串,想要重新格式化它们,以便它们可以根据用户指定的列数显示;
解决方案:可以使用textwrap模块重新格式化文本输出;
导入文本换行
print(textwrap.fill(s,70)) textwrap 模块可以以简单直接的方式格式化文本,使其适合使用- 特别是当您希望输出在终端上很好地显示时;关于终端的大小可以通过os.get_terminal_size()获取;
导入操作系统
【第二章:文本处理与字符串操作基础】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于到了字符串学习阶段!
有8位网友表示赞同!
之前没接触过编程,有点担心这部分内容难度会不会太高啊
有16位网友表示赞同!
字符串怎么处理?应该学到一些很实用的地方吧
有6位网友表示赞同!
希望这本书解释得比较详细,我容易卡在细节上
有7位网友表示赞同!
以前写作文的时候就喜欢玩文字游戏,这章内容感觉很有意思
有11位网友表示赞同!
期待学习如何拼接字符串,太用了!
有20位网友表示赞同!
文本处理?是不是要用到很多算法?
有15位网友表示赞同!
我之前做过一些网页开发,对字符串操作还是有一些了解的
有14位网友表示赞同!
这章内容一定能提升我的编程能力!
有5位网友表示赞同!
希望可以学到一些关于正则表达式的知识
有11位网友表示赞同!
第二章的学习目标是什么呢?提前看看能加深理解
有8位网友表示赞同!
以前用过文本编辑器,但不知道它内部是怎样处理字符串的
有20位网友表示赞同!
会不会有案例练习?我喜欢沉浸式学习
有20位网友表示赞同!
感觉这门课课程设计很完善,从基础到应用都可以学到
有7位网友表示赞同!
学习完第二章,我想自己写一个简单的文本分析程序
有13位网友表示赞同!
期待和大家一起讨论学习笔记 !
有6位网友表示赞同!
希望这本书能教会我如何使用字符串进行高级编程操作
有19位网友表示赞同!