当前位置: 首页 > news >正文

网站建设 业务走下坡番禺人才市场档案中心

网站建设 业务走下坡,番禺人才市场档案中心,美橙云建站,seo做的最好的十个网站我们经常用正则表达式来检测一个字符串中包含某个子串#xff0c;要表示一个字符串中不包含单个的某字符或某些字符也很容易#xff0c;用[^...]形式就可以了。但是要表示一个字符串中不包含某个子串(由字符序列构成)的时候#xff0c;用[^...]这种形式就不行了#xff0c;…我们经常用正则表达式来检测一个字符串中包含某个子串要表示一个字符串中不包含单个的某字符或某些字符也很容易用[^...]形式就可以了。但是要表示一个字符串中不包含某个子串(由字符序列构成)的时候用[^...]这种形式就不行了此时就需要使用到四种正则表达式的扩展匹配了即所谓的“正向前行匹配”  (?...)、“负向前行匹配” (?!...)、正向后行匹配 (?...)  、“负向后行匹配”(?文中的描述从两个方面入手所谓的前行(lookahead)和后行(lookbehind)其实就是向前看和向后看的意思。正则表达式引擎在执行字符串和表达式匹配时会从头到尾(从前到后)连续扫描字符串中的字符设想有一个扫描指针指向字符边界处并随匹配过程移动。前行断言是当扫描指针位于某个位置时引擎会尝试匹配指针还未扫过的字符先于指针到达该字符故称为前行。后行断言引擎会尝试匹配指针已扫过的字符后于指针到达该字符故称为后行。记忆方式后行断言(?pattern)、(?所谓的正向(positive)和负向(negative)正向就表示匹配括号中的表达式负向表示不匹配。记忆方式不等于(!)、逻辑非(!)都是用!号来表示所以有!号的形式表示不匹配、负向将!号换成号就表示匹配、正向。我们特别需要注意的一点是对于后行方式的两种断言(?...)和(?line0 ‘?#?def???func(funcName, funcParam, funcTime360) ‘line1  ‘?def???func(funcName, funcParam, funcTime360) ‘line2  ????obj1(param).func(‘func1‘, ‘param1‘, funcTime150) # testline3  ??obj2().funcTest(1)  # obj1(param).func(‘func1‘, ‘param1‘)我们希望字符串中包含对函数 func()的调用即在被测试line中出现 func(字符串但是在被测line中却又不包含针对函数func的定义即不能出现 “def func(” 字符串并且def 和 func 之间可能包含多个空格。按照最直接的思路为要匹配 func( 字符串并且是在 func( 前面不出现 “def\s”模式的字符串所以首先考虑使用向后看的方法即负向后行匹配方式来应用于line1即 re.findall(r(? re.findall(r(?[‘???func(‘]func前为三个空格这是为什么呢原因是re引擎会去尝试找到一个 \s*func\( 模式的字符串并且在这个字符串前面不会出现 def? 字符串(def后有一个空格)包含三个前置空格的 ???func( 正好就能满足条件首先它能够匹配 \s*func\( 的模式并且这个字符串前面的是不含空格的 def 字符串而不是在负向后行匹配断言(?那么尝试将负向后行匹配断言中def后面的空格去掉即修改为 re.findall((? re.findall(r(?[‘??func(‘]func前为两个空格——仔细分析会发现这是因为原因是re引擎会去尝试找到一个“\s*func\(”模式的字符串并且在这个字符串前面不会出现“def”字符串(def后没有空格)包含2个前置空格的 ??func( 就正好满足条件因为包含2个空格的 ??func( 字符串能够匹配 \s*func\( 的模式并且这个字符串前面的是后接了一个空格的 def? 字符串而不是在负向后行匹配断言pattern (?再尝试在负向后行匹配断言中在def后面使用\s即修改为  re.findall((?——所以对于在 def 和 func之间包含了三个空格的line1要想用负向后行断言来实现匹配必须使用def后包含三个空格而func前无空格的 re.findall((?于是我们只能考虑采取负向前行断言来实现精确匹配即 re.findall(^(?!.*def\sfunc\().*func\(, line1)执行得到的结果为空列表[]同时我们使用正向前行断言来验证我们的匹配字符串使用正确即执行 re.findall(^(?.*def\sfunc\().*func\(, line1)得到的结果为 [‘def   func(‘] re.findall(^(?!.*def\sfunc\().*func\(, line1)[] re.findall(^(?.*def\sfunc\().*func\(, line1)[‘?def???func(‘]—— 这说明我们的负向前行断言正好精确匹配到了 def 和 func 之间存在不定长度空格数的情况。此处再来解析一下这里的负向前行断言的含义^(?!.*def\sfunc\().*func\(  表示从line的起始位置开始向后搜索不允许出现 .*def\sfunc\( 这种模式的字符串但又尝试在此前提下寻找能够匹配  .*func\( 模式的字符串这也就正是我们所希望的过滤条件。此处的 (?!.*def\sfunc\() 是不消耗任何字符串长度的这里需要特别注意的是另外两种与 re.findall(^(?!.*def\sfunc\().*func\(, line1) 很接近的匹配模式1、如果使用的是  re.findall(^(?!def\sfunc\().*func\(, line1)执行的结果将不会是预期的空列表而是 [‘ def???func(‘]这是因为这种写法RE引擎将会尝试搜索是否存在起始位置开始不是 def\sfunc\( 而是 .*func\( 的字符串但是line1中的def前面正好有一个空格所以RE引擎发现从开始位置处搜索到的是带一个前置空格的 ?def\sfunc\( 模式的字符串而不是负向前表达式中没有空格的 def\sfunc\( 模式字符串所以会匹配成功。2、如果使用的是 re.findall((?!.*def\sfunc\().*func\(, line1)执行的结果也不会是预期的空列表而是 [ ‘ef???func(‘ ]这是因为如果pattern中没有了^字符就不是要求line1从开始就必须满足匹配条件而是line1中任意位置能够满足匹配条件都可以所以line1中的 ef???func( 这个字符串就能满足匹配条件—— 综上所述建议尝试正则匹配“在xxx之前不出现yyy且 xxx 和 yyy 之间可能存在其他不定长字符串”的场景时优先考虑使用负向前行断言; 对于能够确定xxx和yyy之间是定长的情况下可以使用负向后行断言再例如考虑在line3中匹配 func( 字符串的时候要求在 func( 前不能出现#符号即要求func函数的调用语句没有被注释掉因为 # 和 func( 之间的字符长度完全是随机未知的故应该使用负向想前行断言方式的 re.findall(^(?!.*#.*func\().*func\(, line3)而不是 re.findall((?原文http://www.cnblogs.com/xaviercd/p/5818731.html
http://www.yutouwan.com/news/120901/

相关文章:

  • 电子商务网站管理系统完美版个人博客网页模板图片
  • 网站开发流行工具深圳外贸公司qc招聘
  • 网站运营的内容外贸网站海外推广3个必去网站
  • 服装网站技术解决方案手机站喝茶影视
  • 建一个网站需要什么资料网站开发都有哪些语言
  • 信用门户网站建设服装网站建设
  • 自己可以创建网站吗网站制作费用及后期运营
  • 万网网站需要的步骤网站访问者qq
  • 网站建设通用代码wordpress 设置网站目录
  • 阿里云备案网站备案域名购买用老域名做新网站 权重怎么传递
  • 网站建设有哪些渠道wordpress .mo .po
  • 山东省品牌建设促进会网站php网站开发总结
  • 网站开发教程H5网页设计图片地址怎么写
  • 定州建设厅网站wordpress标签中文404
  • 东莞网上做公司网站广州建外贸网站
  • 恩施哪里有做网站的中企动力科技股份有限公司销售
  • 高端网站设计合肥网站建设网站代码怎么查看
  • 网站设计在线培训机构企业网站管理系统站长之家
  • 网站打开显示域名错误如何建设自己的网站 知乎
  • 简单的英文网站源码织梦模板网
  • dw做网站字体 别人 电脑朝阳seo搜索引擎
  • 郑州网站优化排名建设部网站在哪里报名考试
  • 做外贸哪些国外网站可以推广外贸网站设计模板
  • 建设银行网站预约取款云盘网页版登录
  • 关于网站建设的文案wordpress设置固定链接404
  • 平台网站建设合同网站代运营要多少费用
  • 做任务网站有哪些内容自己做软件
  • 为什么网站用静态页面快站app制作教程
  • 织梦响应式茶叶网站济南网站制作专业
  • 福鼎市建设局网站淘宝网站c 设计怎么做的