正则表达式中零宽断言的用法

 

原文:静觅 » 正则表达式中零宽断言的用法

#coding=utf-8
import re

text='''
问:我用的是Windows XP+Service Pack 2,为什么无法安装输入卡号和密码的控件? 答:在Windows XP+Service Pack 2、Windows 2003等操作系统中,用户可以自己选择是否安装控件。 问:为什么我看到的卡号输入框显示为*符号? 答:您的浏览器禁止下载执行ActiveX控件 , 对于这种情况 , 您必须打开浏览器的ActiveX的相关权限。 操作方法:在浏览器菜单中选择“工具”|“Internet选项”,在弹出的对话框中选择”安全” |”Internet”|”自定义级别”,在弹出的对话框中选择”重置为 安全级-中” , 点”重置”按钮,确定。 问:看了以上几个问题,还是不能登录,怎么办? 答:您的浏览器由于其他原因不能安装招商银行登录控件, 请下载并安装招商银行登录控件下载版。 问:无法出现个人网上银行大众版登录界面。 答:这种情况是由于您的机器无法和我行服务器建立安全连接,通常是因为代理服务器设置错误引起。如果您是拨号上网,请不要使用代理服务器;如果您过去安装过我行SSL安全代理,请调用“添加-删除程序”删除SSL安全代理;如果您是经过代理访问Internet,请联系您所在网的网络管理员设置代理服务器。IE5.0浏览器设置代理服务器的步骤: Internet选项–>连接–>局域网设置–>使用代理服务器–>高级。 问:我在输入账号和卡号时,总出错,该怎样输? 答:存折账号为10位,按存折本上的账号输入, 密码为6位。如果一卡通是12位卡号的,只需输入地区码后面的8位卡号,不需要输入前面4位的地区码,密码为6位。如果一卡通是16位卡号的,请将16位卡号全部输入,密码为6位。 问:我的存折没有设密码,怎样在个人网上银行大众版中查询余额? 答:存折必须设有密码方可在 个人网上银行大众版 中查询,因此请您到存折开户行给您的存折设置密码。 注:网上个人银行是招商银行为个人客户提供的网上银行。 本页面内容仅供参考,部分业务以当地网点的公告与具体规定为准。
'''

'''第一种,不优雅'''
# results=re.split('问:| 答:',text)
# print(results)
# for index,result in enumerate(results[1:]):
#     print(('Q' if index%2 ==0 else 'A')+':'+result)


'''加上匹配终点'''
# results = re.findall('问:(.*?) 答:(.*?)问:', text, re.S)
# for result in results:
#     print('Q: ' + result[0], 'A: ' + result[1], sep='\n')
'''三个问答对被“吃”掉了,其实这是因为我们的正则表达式最后加了 问:的缘故,findall() 方法它会查找所有符合正则表达式的结果,但其中匹配的时候它内部也是有一个查找索引在扫描的。在查找第一个符合要求的结果时,由于我们是根据正则表达式结尾的 问:来作为结束标志,所以在找到第一个符合要求的结果时,我们的查找索引就已经移动到了第二个问答对开头的 问: 上面'''


'''完美方法:找到完整的留个问答对,就需要用到零宽断言'''
# results = re.findall('问:(.*?) 答:(.*?)(?=问:|\Z)', text, re.S)
# for result in results:
#     print('Q: ' + result[0], 'A: ' + result[1], sep='\n')
'''使用了 (?=)这样的形式来构建了整个表达式,等号后面的内容是 问:或者结束符 \Z,这样其实就保证了在匹配的时候,查找索引不会继续向后移,但这也同时标志了结束标志,因此它就可以查找到完整的内容了。'''

零断宽言

将结尾标识符改成了 (?=,个人博客) ,这样就将此部分内容作为零宽度匹配,它代表后面需要跟 ,个人博客,但是它不会出现在匹配结果中。

import re
str = '我的个人邮箱是[email protected],个人博客是cuiqingcai.com,个人公众号是进击的Coder'
result = re.search('我的个人邮箱是(.*?),个人博客', str)
print('整句结果:' + result.group(), '第一个匹配结果:' + result.group(1), sep='\n')
print('---'*20)
result = re.search('我的个人邮箱是(.*?)(?=,个人博客)', str)
print('整句结果:' + result.group(), '第一个匹配结果:' + result.group(1), sep='\n')

 

 

 

 

你可能感兴趣的:(编程语言)