python re.search 和 re.match 正则表达式 (1/2)

 更新时间:2016年11月25日 14:56  点击:2317

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
#none

def 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

 

[!--infotagslink--]

相关文章

  • PHP正则表达式取双引号内的内容

    取双引号内的内容我们如果一个字符串中只有一个可以使用explode来获得,但如果有多个需要使用正则表达式来提取了,具体的例子如下。 写程序的时候总结一点经验,如何只...2016-11-25
  • PHP正则表达式之捕获组与非捕获组

    今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同...2015-11-08
  • php 验证只能输入汉字、英语、数字的正则表达式

    正则表达式是一门非常有用的并且进行模糊判断的一个功能了,我们下面来看通过正则来验证输入汉字、英语、数字,具体如下。 收藏了正则表达式。可以验证只能输入数...2016-11-25
  • java正则表达式判断前端参数修改表中另一个字段的值

    这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
  • 常用的日期时间正则表达式

    常用的日期时间正则表达式 下面收藏了大量的日期时间正则匹配函数,包括分钟,时间与秒都能达到。 正则表达式 (?n:^(?=d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(...2016-11-25
  • PHP正则表达式匹配验证提取网址URL实例总结

    网址规则是可寻的,所以我们可以使用正则表达式来提取字符串中的url地址了,下面一起来看看小编整理的几个PHP正则表达式匹配验证提取网址URL实例. 匹配网址 URL 的...2016-11-25
  • 一个关于JS正则匹配的踩坑记录

    这篇文章主要给大家介绍了一个关于JS正则匹配的踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-13
  • 正则表达式中两个反斜杠的匹配规则详解

    这篇文章主要介绍了正则表达式中两个反斜杠的匹配规则,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-07
  • C#正则表达式使用方法示例

    这篇文章主要介绍了C#正则表达式使用方法,大家参考使用...2020-06-25
  • JS中使用正则表达式g模式和非g模式的区别

    这篇文章给大家详细介绍了JS中使用正则表达式g模式和非g模式的区别,非常不错,具有参考借鉴价值,需要的朋友参考下吧...2017-04-03
  • 常用C#正则表达式汇总介绍

    c#正则表达式,用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。...2020-06-25
  • JavaScript利用正则表达式替换字符串中的内容

    本文主要介绍了JavaScript利用正则表达式替换字符串中内容的具体实现方法,并做了简要注释,便于理解。具有一定的参考价值,需要的朋友可以看下...2017-01-09
  • 一文秒懂python正则表达式常用函数

    这篇文章主要介绍了python正则表达式常用函数及使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-07
  • Idea使用正则表达式批量替换字符串的方法

    这篇文章给大家介绍了Idea使用正则表达式批量替换字符串的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧...2021-07-21
  • PHP正则表达式之捕获组与非捕获组

    今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同...2015-11-08
  • js正则学习小记之匹配字符串字面量

    关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配,因为我想学完之后写个语法高亮练手,所以用js代码当作例子...2021-05-07
  • C# 中使用正则表达式匹配字符的含义

    正则表达式的作用用来描述字符串的特征。本文重点给大家介绍C# 中使用正则表达式匹配字符的含义,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧...2020-06-25
  • Python验证的50个常见正则表达式

    这篇文章主要给大家介绍了关于利用Python验证的50个常见正则表达式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-11
  • C#编程自学之运算符和表达式

    这篇文章主要介绍了C#运算符和表达式,这是自学C#编程的第五篇,希望对大家的学习有所帮助。...2020-06-25
  • PHP正则表达式过滤html标签属性(DEMO)

    这篇文章主要介绍了PHP正则表达式过滤html标签属性的相关内容,实用性非常,感兴趣的朋友参考下吧...2016-05-06