python re.search 和 re.match 正则表达式 (1/2)
python re.search 和 re.match 正则表达式
一 re.search 和 re.match
python提供了2中主要的正则表达式操作:re.match 和 re.search。
match :只从字符串的开始与正则表达式匹配,匹配成功返回matchobject,否则返回none;
search :将字符串的所有字串尝试与正则表达式匹配,如果所有的字串都没有匹配成功,返回none,否则返回matchobject;(re.search相当于perl中的默认行为)
实例代码:
import re
def testsearchandmatch():
s1="helloworld, i am 30 !"
w1 = "world"
m1 = re.search(w1, s1)
if m1:
print("find : %s" % m1.group())
if re.match(w1, s1) == none:
print("cannot match")
w2 = "helloworld"
m2 = re.match(w2, s1)
if m2:
print("match : %s" % m2.group())testsearchandmatch()
#find : world
#cannot match
#match : helloworld
二 re.compile 和 re.ignorecase
re.compile返回regrexobject对象, 用来重复使用regrexobject;
re.ignorecase用来在匹配时忽略大小写;
实例代码:
def testcompile():
regex = "d{3}-d{7}"
regexobject = re.compile(regex)
print(regexobject.search("aaa 027-4567892").group())
print(regexobject.search("bbb 021-1234567").group())
print(regexobject.search("ccc 010-123456"))testcompile()
#027-4567892
#021-1234567
#nonedef testignorecase():
print(re.search('world', "hello world !").group())
print(re.search('world', "hello world !", re.ignorecase).group())
print(re.search('world', "hello world !"))
testignorecase()
#world
#world
#none
三 matchobject
matchobject为re.search,re.match等匹配成功后返回的对象,包含了匹配的结果。
在正则表达式中,可以使用()来将部分正则表达式分组且编号,编号从1开始,使用数字来使用,例如1 2 3,(?p<name>)还可以给分组命名, 使用(?p=name)来使用命名的组。
matchobject.group()包含了所有匹配的内容,等价于matchobject.group(0),此时的0表示所有的匹配;
matchobject.groups教程()包含了正则表达式中所有使用()定义的组对应的匹配内容;
matchobject.group(n),表示返回正则表达式中的第n个组()匹配的内容,此时n不为0, 等价于matchobject.groups()[n-1];
matchobject.lastindex, 表示正则表达式中分组()的个数;
实例代码:
def testmatchobject():
m = re.match(r"(?p<year>d{4})-(?p<month>d{2})-(?p<date>d{2})", "2010-10-01, i am very happy")
print(m.group())
print(m.group(0))
print(m.groups())
print(m.group(1))
print(m.groups()[0])
print(m.group(2))
print(m.groups()[1])
print(m.group(3))
print(m.groups()[2])
print(m.groupdict())
print(m.lastindex)testmatchobject()
#2010-10-01
#2010-10-01
#('2010', '10', '01')
#2010
#2010
#10
#10
#01
#01
#{'date': '01', 'year': '2010', 'month': '10'}
#3
四 re和matchobject的方法split+findall+finditer+sub
split方法,使用给定的表达式来分割字符串;
findall方法,返回所有的与给定的表达式匹配的一个list;
finditer方法,返回所有与给定的表达式匹配的matchobject的iterator;
sub方法,使用新的字符串替换表达式匹配的字符串;
使用python对txt格式的小说进行处理
vim的确是神器,可惜sed与vim不完全通用。这篇文章受《 用vim对txt格式的小说重新排版》的启发,在此致谢!
经常下载txt的电子书,格式却不合心意,只好自己再处理。首要的就是处理段内换行。
原来的打算是定制一个vim模式,到时候处理小说时进入该模式,再使用各种快捷键。以此避免txt快捷键对日常编程的干扰。后来发现,vim不像emacs,可以定制自己的模式。(可能可以定制专用的vimrc解决,未经尝试)
于是转向脚本寻求解决办法。sed与awk是此中翘楚,首先试试。可惜早些日子学的sed已经忘的差不多了,找不到比较简洁清晰的解决办法。sed与grep类似,先读入一行,删除n,进行各种处理,最后写入文件,再添上n。 n可以读入下一行到当前模式匹配空间再行处理。但是我需要对整个文件进行匹配,暂时未找到解决办法。
只好再次转投python。python有自己的re模块,应该没问题。re.sub可以进行替换。费了些时间的,是对中文的匹配。在vim中,可以用[^x00-xff]匹配双字节字符,然而python中却行不通。经过一番google,发现可以用[x80-xff]匹配汉字(perl同此,似乎两者对中文的正则支持还是有待改进)。
至此,问题初步解决:
view sourceprint?01 #!/usr/bin/env python
02 #encoding=utf-8
03 import re
04 from sys import argv
05
06
07 if __name__ == '__main__':
08 if len(argv) != 2:
09 print 'usage: filename'
10 else:
11 fh = open(argv[1], 'r')
12 content = fh.read()
13 out = re.sub('n([x80-xff])', r'1', content)
14 print out
规范行首:
view sourceprint?01 #!/usr/bin/env python
02 #encoding=utf-8
03 import re
04 from sys import argv
05
06
07 if __name__ == '__main__':
08 if len(argv) != 2:
09 print 'usage: filename'
10 else:
11 fh = open(argv[1], 'r')
12 content = fh.read()
13 out = re.sub(' +([x80-xff])', r' 1', content)
14 print out
当然,下载来的文档通常是gb2312,需要自己转换为utf8再行处理,可以参考我的《python 中文编码笔记》
import re
warninglist = []
warninglist.append("warning cd{4}")
errorlist = []
errorlist.append("error lnkd{4}")
errorlist.append("error cd{4}")
def parse(logfile, regexlist):
resultlines = []
with open(logfile, "r") as log:
for line in log:
for regex in regexlist:
m = re.search(regex, line)
if m:
resultlines.append(line)
return resultlines
def parsewarning(logfile):
warnings = []
warnings = parse(logfile, warninglist)
return warnings
def parseerror(logfile):
errors = []
errors = parse(logfile, errorlist)
return errors
ws = parsewarning("buildlog.txt")
print( "warnings:" + str(len(ws)))
for w in ws:
print (w)
es = parseerror("buildlog.txt")
print( "errors:" + str(len(es)))
for e in es:
print(e)
简单地解析visualstudio的buildlog:(有的时候log文件太长,但是我们只是关心warning和error, 通过该程序可以直接得到所有的warning和error的行
我还是个新手,刚开始学python对它感兴趣是因为之前有看过一点。eric说这是一门非常好的人。
python是优雅而健壮,有传统语言的强大性和通用性,而且易用。只有想不到没有python做不到的。
起源:van rossum 1989年创始python,voor是cwi工程师,91年初发行第一个版本,原因是有个项目需要。
可升级:可扩展。易学,
python主要是两种方式完成工作:语句和表达式,语句使用关键字来组成命令,告诉多功能解释器一个命令,你告诉
python做什么,它就为你做什么,语句可以有输出也可以没有输出,
如,print 'hello world!'
表达式没有关键字,可以用数学操作符构成算术表达式,也可以用括号调用函数,可以接受用户输入。可以不接受用户输入
程序输出:print语句
>>> mystring = 'hello,world!'
>>> print mystring
hello,world!
把一个字符串给mystring 用pring 来显示变量内容
print 与%的使用实现字符串替换功能,
>>> print "%s is number %d!" % ("python",1)
python is number 1!
%表示由一个字符串来替换,%d由一个整型来替换,%f是浮点来替换,pring也可以将输出重定向到文件。从python2.0后新增
这一点很重要.
程序输入命令:
>>> user = raw_input('qin ni shu ru')
qin ni shu ruroot
>>> print 'ni shu ru de shi',user
ni shu ru de shi root
用raw_input内建函数,输入的是文本
now enter anumber: 1024
>>> print 'doubling your number: %d' % (int(num) * 2)
doubling your number: 2048
也可以输入字符串值 int(是将数值)
#是python的注shi
相关文章
- 取双引号内的内容我们如果一个字符串中只有一个可以使用explode来获得,但如果有多个需要使用正则表达式来提取了,具体的例子如下。 写程序的时候总结一点经验,如何只...2016-11-25
- 今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同...2015-11-08
- 正则表达式是一门非常有用的并且进行模糊判断的一个功能了,我们下面来看通过正则来验证输入汉字、英语、数字,具体如下。 收藏了正则表达式。可以验证只能输入数...2016-11-25
- 这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
- 常用的日期时间正则表达式 下面收藏了大量的日期时间正则匹配函数,包括分钟,时间与秒都能达到。 正则表达式 (?n:^(?=d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(...2016-11-25
- 网址规则是可寻的,所以我们可以使用正则表达式来提取字符串中的url地址了,下面一起来看看小编整理的几个PHP正则表达式匹配验证提取网址URL实例. 匹配网址 URL 的...2016-11-25
- 这篇文章主要给大家介绍了一个关于JS正则匹配的踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-13
- 这篇文章主要介绍了正则表达式中两个反斜杠的匹配规则,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-07
- 这篇文章主要介绍了C#正则表达式使用方法,大家参考使用...2020-06-25
- 这篇文章给大家详细介绍了JS中使用正则表达式g模式和非g模式的区别,非常不错,具有参考借鉴价值,需要的朋友参考下吧...2017-04-03
- c#正则表达式,用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。...2020-06-25
- 本文主要介绍了JavaScript利用正则表达式替换字符串中内容的具体实现方法,并做了简要注释,便于理解。具有一定的参考价值,需要的朋友可以看下...2017-01-09
- 这篇文章主要介绍了python正则表达式常用函数及使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-07
- 这篇文章给大家介绍了Idea使用正则表达式批量替换字符串的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧...2021-07-21
- 今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同...2015-11-08
- 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配,因为我想学完之后写个语法高亮练手,所以用js代码当作例子...2021-05-07
- 正则表达式的作用用来描述字符串的特征。本文重点给大家介绍C# 中使用正则表达式匹配字符的含义,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧...2020-06-25
- 这篇文章主要给大家介绍了关于利用Python验证的50个常见正则表达式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-11
- 这篇文章主要介绍了C#运算符和表达式,这是自学C#编程的第五篇,希望对大家的学习有所帮助。...2020-06-25
- 这篇文章主要介绍了PHP正则表达式过滤html标签属性的相关内容,实用性非常,感兴趣的朋友参考下吧...2016-05-06