第11章 Python文本处理new_第1页
第11章 Python文本处理new_第2页
第11章 Python文本处理new_第3页
第11章 Python文本处理new_第4页
第11章 Python文本处理new_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第11章Python文本处理11.1字符串基本处理11.2正则表达式11.3Python中文分词11.1字符串基本处理1.按照某种格式生产字符串str.format(*args,**kwargs)。例如:'1+2={0}'.format(1+2)2.字符串连接和重复字符串可以用+号连接起来,用*号重复:>>>word='Help'+'A'>>>word'HelpA'>>>'<'+word*5+'>'#重复5次'<HelpAHelpAHelpAHelpAHelpA>'11.1字符串基本处理3.字符串索引和切片字符串可以象在C语言中那样用下标索引,字符串的第一个字符下标为0。Python没有单独的字符数据类型,一个字符就是长度为一的字符串。可以用切片(slice)来截取其中的任意部分形成新子串,切片即用冒号隔开的两个下标。>>>word='HelpA'>>>word[4]#下标索引为4的字符,即'A'>>>word[0:2]#'He'>>>word[2:4]'lp'11.1字符串基本处理4.判断是否是子串在python中,in判断某一字符串是否在另一个字符串中:'nice'in'niceday'#True5.替换字符串中的部分内容替换有2中方法,一种是使用字符串str对象的方法replace(),另一种是使用re模块中sub()的。6.拆分字符串主要使用str对象的split()方法。split(str="",num=string.count(str))7.合并字符串拆分功能相反,我们可以将列表合并成一个字符串。这个功能使用str对象的join()方法。11.1字符串基本处理8.检测字符串中是否包含某子字符串find()方法检测字符串中是否包含某子字符串,find()方法语法:str.find(str,beg=0,end=len(string))参数str指定检索的字符串,beg开始索引默认为0,end结束索引默认为字符字符串的长度。如果指定beg(开始)和end(结束)范围,则检查是否包含在指定范围内,如果包含子字符串则返回开始的索引值,否则返回-1。11.2正则表达式正则表达式是一种用来匹配字符串文本的强有力的武器。它是用一种描述性的语言来给字符串定义一个规则。凡是符合规则的字符串,就认为它“匹配”了,否则,该字符串就是不合法的。11.2.1

正则表达式语法正则表达式并不是Python中特有的功能,它是一种通用的方法。要使用它必须会用正则表达式来描述文本规则。正则表达式使用特殊的语法来表示,表11-1列出了正则表达式语法。11.2正则表达式正则表达式使用特殊的语法来表示,表11-1列出了正则表达式语法。11.2正则表达式正则表达式使用特殊的语法来表示,表11-1列出了正则表达式语法。下面列出正则表达式的应用实例。11.2正则表达式1.匹配单个字符从正则表达式语法中可见用\d可以匹配一个数字,\w可以匹配一个字母或数字,.可以匹配任意单个字符,所以:模式'00\d'可以匹配'007',但无法匹配'00A';模式'\d\d\d'可以匹配'010';模式'\w\w\d'可以匹配'py3';模式'py.'可以匹配'pyc'、'pyo'、'py!'等等。11.2正则表达式2.匹配变长的字符串---量词要匹配变长的字符串,在正则表达式模式字符串中,用*表示任意个字符(包括0个),用+表示至少一个字符,用?表示0个或1个字符,用{n}表示n个字符,用{n,m}表示n-m个字符。来看一个复杂的表示电话号码例子:电话号码例子一个复杂的表示电话号码例子:\d{3}\s+\d{3,8}我们来从左到右解读一下:\d{3}表示匹配3个数字,例如'010';\s可以匹配一个空格(也包括Tab等空白符),所以\s+表示至少有一个空格;\d{3,8}表示3-8个数字,例如'67665230'。综合起来,上面的正则表达式可以匹配以任意个空格隔开的带区号的电话号码。'01067665230''037167665230’修改为\d{3,4}\s+\d{3,8}11.2正则表达式3.[]表示范围如果要做更精确地匹配,可以用[]表示范围,比如:[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线;[0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如'a100','0_Z','Py3000'等等;[a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;[a-zA-Z\_][0-9a-zA-Z\_]{0,19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'。[^...]形式表示排除的字符,例如[^abc]匹配除了a,b,c之外的字符。[^0-9]匹配除了数字外的字符。11.2正则表达式3.[]表示范围如果要做更精确地匹配,可以用[]表示范围,比如:[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线;[0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如'a100','0_Z','Py3000'等等;[a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;[a-zA-Z\_][0-9a-zA-Z\_]{0,19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'。[^...]形式表示排除的字符,例如[^abc]匹配除了a,b,c之外的字符。[^0-9]匹配除了数字外的字符。11.2正则表达式4.匹配字符串的开头和结束^表示字符串的开头,例如^\d表示字符串必须以数字开头。$表示字符串的结束,例如\d$表示必须以数字结束。例如:^\d{3,4}\-\d{3,8}$表示带区号的电话号码。'037167665230'aaa037167665230'\d{3,4}\s+\d{3,8}11.2正则表达式4.匹配字符串的开头和结束^表示字符串的开头,例如^\d表示字符串必须以数字开头。$表示字符串的结束,例如\d$表示必须以数字结束。例如:^\d{3,4}\-\d{3,8}$表示带区号的电话号码。'037167665230'aaa037167665230'\d{3,4}\s+\d{3,8}11.2正则表达式5.数量词的贪婪模式与非贪婪模式正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的,总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。而如果使用非贪婪的数量词"ab*?",将找到"a"。分组注意,前面讲到的符号仅仅能让正则表达式“表示”一串字符串。但是如果要从一段字符串中“提取”出一部分内容这时就要用小括号()。例如一个字符串“我的密码是:123abc你帮我记住。”从中可见密码左边是英文冒号,右边是“你”。

当构造一个正则表达式——

:.*?你,得到结果是

:123abc你然而英文冒号和“你”并不是密码,如果只想要“123abc”,此时使用小括号()提取,即构造一个正则表达式——:(.*?)你,得到结果是

123abc11.2.2re模块Python提供re模块,包含所有正则表达式的功能。Python中pile函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象,该正则表达式对象拥有一系列方法用于正则表达式匹配和替换。同时re模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。本节主要介绍Python中常用的正则表达式处理函数。1.match()方法2.分组3.切分字符串4.search()和findall()方法5.compile函数→生成一个正则表达式对象11.2.2re模块1.match()方法re.match()格式为:re.match(pattern,string,flags)re.match()方法从字符串起始位置判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None。>>>importre#导入re正则表达式模块>>>re.match(r'^\d{3}\-\d{3,8}$','010-12345')#返回一个Match对象<_sre.SRE_Matchobject;span=(0,9),match='010-12345'>>>>re.match(r'^\d{3}\-\d{3,8}$','01012345')#'01012345'不匹配规则,返回NoneMatch对象是一次匹配的结果。(1)Match对象的属性string:匹配时使用的文本。re:匹配时使用的Pattern对象。pos:文本中正则表达式开始搜索的位置。endpos:文本中正则表达式结束搜索的位置。lastindex:最后一个被捕获的分组在文本中的位置。lastgroup:最后一个被捕获的分组的别名。(2)Match对象的方法group([group1,…]):返回一个或多个分组截获的字符串;指定多个参数时将以元组形式返回。参数group1可以使用编号也可以使用别名;编号0代表整个匹配的子串;不填写参数时返回group(0)。>>>importre>>>re.match(r'^\d{3}\-\d{3,8}$','010-12345')<re.Matchobject;span=(0,9),match='010-12345'>>>>re.match(r'\d{3}\-\d{3,8}','010-12345')<re.Matchobject;span=(0,9),match='010-12345'>>>>re.match(r'\d{3}\-\d{3,8}','010-123456789012')<re.Matchobject;span=(0,12),match=>>>>a=re.match(r'\d{3}\-\d{3,8}','010-123456789012')>>>a<re.Matchobject;span=(0,12),match=>>>>a.string#'010-123456789012'>>>a.re#pile('\\d{3}\\-\\d{3,8}')>>>a.pos#0>>>a.group(0)>>>a=re.match(r'\d{3}\-\d{3,8}','a010-123456789012')>>>aisNoneTrue11.2.2re模块2.分组正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(Group)^(\d{3})-(\d{3,8})$分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码:>>>m=re.match(r'(\d{3})-(\d{3,8})','010-123456789012')>>>m.group(0)#>>>m.group(1)#'010'>>>m.group(2)#'12345678'注意group(0)是整个匹配的子串,group(1)、group(2)……表示第1、2、……个子串(分组)。11.2.2re模块3.切分字符串re.split(r'\s+',text)将字符串按空格分割成一个单词列表。>>>re.split(r'\s+','abbbbbc')#用正则表达式['ab','bbbb','c']11.2.2re模块4.search()和findall()方法re.match()总是从字符串“开头”去匹配,并返回匹配的字符串的Match对象。所以当用re.match()去匹配非“开头”部分的字符串时,会返回NONE。str1='HelloWorld!'print(re.match(r'World',str1))#结果为:NONE如果想在字符串内任意位置去匹配请用re.search()或re.findall()。re.search()将对整个字符串进行搜索,并返回第一个匹配的字符串的Match对象。str1='HelloWorld!'print(re.search(r'World',str1))输出结果:<_sre.SRE_Matchobject;span=(6,11),match='World'>re.findall()函数将返回所有匹配的字符串的一个字符串列表。这在爬虫程序里经常使用。re.findall()函数将返回所有匹配的字符串的一个字符串列表。这在爬虫程序里经常使用。str1='Hi,IamShirleyHilton.Iamhiswife.'>>>print(re.search(r'hi',str1))输出结果将是:<_sre.SRE_Matchobject;span=(10,12),match='hi'>第一个匹配的>>>re.findall(r'hi',str1)输出结果将是:

['hi','hi']11.2.2re模块5.re.sub()方法re.sub用于替换字符串中的匹配项。格式为:re.sub(pattern,repl,string,count=0,flags=0)第一个参数pattern是正则表达式,第二个参数repl表示替换的字符串,第三个参数string要要被查找替换的原始字符串;count参数是模式匹配后替换的最大次数,默认0表示替换所有的匹配。例如:url='http://36:9011/index.html'#原始字符串pattern='http://(.*?):9011/'out=re.sub(pattern,':8089/',url)#替换网址为:8089/index.htmlprint(out)11.2.2re模块6.compile函数compile函数用于编译正则表达式,生成一个正则表达式(Pattern)对象,该对象拥有一系列方法【match()和search()、findall()】用于正则表达式匹配和替换。语法格式为:pile(pattern[,flags])pattern:一个字符串形式的正则表达式。flags:可选,表示匹配模式,比如忽略大小写,多行模式等,importrepattern=pile(r'\d+')#生成正则表达式(Pattern)对象用于匹配至少一个数字m=pattern.match('12twothree34four')#查找头部,没有匹配,结果是None<re.Matchobject;span=(0,2),match='12'>等价于m=re.match('\d+','12twothree34four')正则表达式转换成对象importrekey=r'<ahref="">中工1</a>and<ahref="">中工2</a>'p1=r'<a.*?href="(http.*?)".*?>(.*?)</a>'#正则表达式pattern1=pile(p1)#把正则表达式转换成对象来调用findall()和match()urls=pattern1.findall(key)#超链接网址的列表#urls=re.findall(p1,key)forurlinurls:print(url)11.3Python中文分词

中文分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。中文分词是网页分析索引的基础,因此搜索引擎对于分词的准确率和速率都提出了很高的要求。

“结巴”中文分词是一个支持中文分词,高准确率、高效率的Python中文分词组件。支持繁体分词和自定义词典,“结巴”中文分词支持三种分词模式:1)精确模式:试图将句子最精确地切开,适合文本分析;2)全模式:把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义;3)搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。11.3Python中文分词

中文分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。中文分词是网页分析索引的基础,因此搜索引擎对于分词的准确率和速率都提出了很高的要求。

“结巴”中文分词是一个支持中文分词,支持繁体分词和自定义词典,“结巴”中文分词支持三种分词模式:1)精确模式:试图将句子最精确地切开,适合文本分析;2)全模式:把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义;3)搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。我来到北京清华大学DefaultMode:我/来到/北京/清华大学FullMode:我/来到/北京/清华/清华大学/华大/大学搜索引擎模式:我/来到/北京/清华/华大/大学/清华大学11.3.1安装和使用jieba命令行状态下输入pipinstalljieba出现如下提示则安装成功。Installingcollectedpackages:jiebaRunningsetup.pyinstallforjieba...doneSuccessfullyinstalledjieba-0.38组件提供jieba.cut()方法用于分词,cut()方法接受两个输入参数:(1)第一个参数为需要分词的字符串

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论