Python之正则

从学习Python至今,发现很多时候是将Python作为一种工具。特别在文本处理方面,使用起来更是游刃有余。

说到文本处理,那么正则表达式必然是一个绝好的工具,它能将一些繁杂的字符搜索或者替换以非常简洁的方式完成。

我们在处理文本的时候,或是查询抓取,或是替换.

一.查找

如果你想自己实现这样的功能模块,输入某一个ip地址,得到这个ip地址所在地区的详细信息.

然后你发现http://ip138.com 可以查出很详细的数据

但是人家没有提供api供外部调用,但是我们可以通过代码模拟查询然后对结果进行抓取.

通过查看这个相应页面的源码,我们可以发现,结果是放在三个<li></li>中的

Html代码  

  1. <table width="80%"  border="0" align="center" cellpadding="0" cellspacing="0">
  2. <tr>
  3. <td align="center"><h3>ip138.com IP查询(搜索IP地址的地理位置)</h3></td>
  4. </tr>
  5. <tr>
  6. <td align="center"><h1>您查询的IP:121.0.29.231</h1></td>
  7. </tr>
  8. <tr>
  9. <td align="center"><ul class="ul1"><li>本站主数据:浙江省杭州市 阿里巴巴</li><li>参考数据一:浙江省杭州市 阿里巴巴</li><li>参考数据二:浙江省杭州市 阿里巴巴</li></ul></td>
  10. </tr>
  11. <tr>
  12. <td align="center">如果您发现查询结果不详细或不正确,请使用<a href="ip_add.asp?ip=121.0.29.231"><font color="#006600"><b>IP数据库自助添加</b></font></a>功能进行修正<br/><br/>
  13. <iframe src="/jss/bd_460x60.htm" frameborder="no" width="460" height="60" border="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><br/></td>
  14. </tr>
  15. <form method="get" action="ips8.asp" name="ipform" onsubmit="return checkIP();">
  16. <tr>
  17. <td align="center">IP地址或者域名:<input type="text" name="ip" size="16"> <input type="submit" value="查询"><input type="hidden" name="action" value="2"></td>
  18. </tr><br>
  19. <br>
  20. </form>
  21. </table>

如果你了解正则表达式你可能会写出

正则表达式

(?<=<li>).*?(?=</li>)

这里使用了前瞻:lookahead 后顾: lookbehind,这样的好处就是匹配的结果中就不会包含html的li标签了.

如果你对自己写的正则表达式不是很自信的话,可以在一些在线或者本地的正则测试工具进行一些测试,以确保正确.

接下来的工作就是如果用Python实现这样的功能,首先我们得将正则表达式表示出来:

Python代码  

  1. r"(?<=<li>).*?(?=</li>)"

Python中字符串前面加上前导r这个字符,代表这个字符串是R aw String(原始字符串),也就是说Python字符串本身不会对字符串中的字符进行转义.这是因为正则表达式也有转义字符之说,如果双重转义的话,易读性很差.

这样的串在Python中我们把它叫做"regular expression pattern"

如果我们对pattern进行编译的话

Python代码  

  1. prog = re.compile(r"(?<=<li>).*?(?=</li>)")

我们便可以得到一个正则表达式对象regular expression object,通过这个对象我们可以进行相关操作.

比如

Python代码  

  1. result=prog.match(string)
  2. ##这个等同于
  3. result=re.match(r"(?<=<li>).*?(?=</li>)",string)
  4. ##但是如果这个正则需要在程序匹配多次,那么通过正则表达式对象的方式效率会更高

接下来就是查找了,假设我们的html结果已经以html的格式存放在text中,那么通过

Python代码  

  1. result_list = re.findall(r"(?<=<li>).*?(?=</li>)",text)

便可以取得所需的结果列表.

二.替换

使用正则表达式进行替换非常的灵活.

比如之前我在阅读Trac这个系统中wiki模块的源代码的时候,就发现其wiki语法的实现就是通过正则替换进行的.

在使用替换的时候会涉及到正则表达式中的Group分组的概念.

假设wiki语法中使用!表示转义字符即感叹号后面的功能性字符会原样输出,粗体的语法为

写道

‘‘‘这里显示为粗体‘‘‘

那么有正则表达式为

Python代码  

  1. r"(?P<bold>!?‘‘‘)"

这里的?P<bold>是Python正则语法中的一部分,表示其后的group的名字为"bold"

下面是替换时的情景,其中sub函数的第一个参数是pattern,第二个参数可以是字符串也可以是函数,如果是字符串的话,那么就是将目标匹配的结果替换成指定的结果,而如果是函数,那么函数会接受一个match object的参数,并返回替换后的字符串,第三个参数便是源字符串.

Python代码  

  1. result = re.sub(r"(?P<bold>!?‘‘‘)", replace, line)

每当匹配到一个三单引号,replace函数便运行一次,可能这时候需要一个全局变量记录当前的三单引号是开还是闭,以便添加相应的标记.

在实际的trac wiki的实现的时候,便是这样通过一些标记变量,来记录某些语法标记的开闭,以决定replace函数的运行结果.

--------------------

写的有点粗,改日补详细.

时间: 2024-08-01 08:16:50

Python之正则的相关文章

python 中文正则表达匹配

需求:由于某个n年前的工具的错误,在复制一批文件的时候产生了大量的"复件xxxxxxx""复件(2)XXXXX"等类似文件,由于目录结构深,文件多,预计在5000万个,但是有多少这种错误的文件不清楚,因此写个脚本遍历删除. #encoding=utf-8 #author: skybug #date: 2014-05-11 #function: 遍历指目录,删除中文开头的文件名的图片 import os,re cnt = 0 pattern = re.compile(

python通过正则获取字符串指定开头和结尾的中间字符串的代码

下面的代码是关于python通过正则获取字符串指定开头和结尾的中间字符串的代码,应该能对各位朋友有些好处. def GetMiddleStr(content,startStr,endStr): patternStr = r'%s(.+?)%s'%(startStr,endStr) p = re.compile(patternStr,re.IGNORECASE) m= re.match(p,content) if m: return m.group(1) 原文地址:http://blog.51ct

python基础-正则2

正则函数 Python提供re模块,包含所有正则表达式的功能 由于python的字符串本身也有\转义,所以需要注意: s = "ABC\\-001" 对应的正则表达式应为:'ABC\-001' 用python的r前缀,就不用考虑转义问题 可以使用 s = r'ABC\-001' 对应的正则表达式为:'ABC\-001' match() 判断是否匹配成功,如果匹配成功,返回一个match对象,否则返回None test = "用户输入的字符串" if re.match

python基础-正则1

什么是正则表达式? 正则表达式是一种小型的\高度专业化的变成语言,主要用于字符串处理 正则表达式是一种通用语言,在python中通过re模块实现,import re 工具:在线正则表达式测试 http://tool.oschina.net/regex/ http://www.jb51.net/shouce/jquery1.82/regexp.html 字符匹配-普通字符 大多数字符和自身完全匹配.如表达式shit与字符串"shit"完全匹配 字符匹配-元字符 ^ 匹配行首 $ 匹配行尾

python - re正则匹配模块

re模块 re 模块使 Python 语言拥有全部的正则表达式功能. compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象.该对象拥有一系列方法用于正则表达式匹配和替换. re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数. re.match函数 re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none. # (匹配规则,字符串,特殊标志) re.match(pattern

python re正则

正则表达式 regex 动机 : 对字符串(文本)的操作是计算机的主要工作之一 从文本或大字符串中找到某一类型的字串 为了解决以上问题----> 正则表达式 定义 : 本质是由一系列字符和特殊符号组成的字串,用来表示一定规则的某 一类字符串. 优点和使用 : 1.是一个独立的技术2.能被多种编程语言使用 python ---> re re.findall(regex,string)功能 : 按照正则表达式匹配字符串参数 : regex 正则表达式 string 目标字符串返回值 : 返回一个列

python与正则

想了解正则的使用,请点击:正则表达式.每种编程语言有一些独特的匹配方式,python也不例外: 语法 含义 表达实例 完整匹配匹配的字符串 \A 仅匹配字符串开头 \Aabc abc \Z 仅匹配字符串末尾 abc\Z abc (?P 分组,除了原有编号再指定一个额外的别名 (?P abcabc (?P=name) 引用别名为 (?P 1abc1\n5abc5 在python语句中要匹配字符,需要在表达式中写\\\\,因为python编译需要\\表示\,同时正则也是.或者使用python原生字符

Python中正则匹配使用findall时的注意事项

在使用正则搜索内容时遇到一个小坑,百度搜了一下,遇到这个坑的还不少,特此记录一下. 比如说有一个字符串  "[email protected]@[email protected]@asdfcom" 想匹配出里面所有的邮箱地址,该怎么实现呢? 写了个正则,测试一下: >>> import re >>> s = "[email protected]@[email protected]@asdfcom" >>> pat

python之正则re模块

1.正则的语法:  中文教程:https://wizardforcel.gitbooks.io/py-re-guide/content/index.html 1.re的数量词: 1. ^   匹配度字符串开始位置 2. $   匹配字符串结束的地方: tr = 'jgko22rkdljgkd' r2 = re.findall('^jgkd', tr) print(r2) # []是空的 r4 = re.findall('^jgko', tr) print(r4) # ['jgko'] r3 =