登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

pcwanli的博客

nx

 
 
 

日志

 
 

正则表达式单行、多行模式简介(使用说明)  

2016-05-09 20:57:25|  分类: Python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

单行模式可简单理解成把文本数据理解为一个字符串来进行匹配,因此字符串中间必然存在换行符,那么此时点号就必须包含换行符。相反多行则把整个文本数据理解成按换行进行分割的多个字符串,因此点号不包含换行符。

在网页源码中,使用正则表达式匹配href中的地址时,某些地址是中间换行的,因此需要使用单行模式进行匹配,才可正确匹配换行的网址数据。

在python中是:re.findAll(r'xxxxxxxxxxxxxxxxxxxxxxxxx',content,re.S)



继上几篇正则表达式相关说明(详情:正则表达式 ),我们今天继续讨论下,它的单行,多行模式使用,及容易出现错误地方。单行,多行模式,都是正则表达式的模式修饰符里面出现的参数。目前常用正则表达式都有该使用选项,如:javascript 正则表达式,一般是:”/正则表达式匹配字符/修饰符“ ,最后一个”/” 后面是修饰符。然后,php也是类似的,c#,python等,一般调用正则表达式的匹配函数,都有一个另外选项的,设置模式。

  • 单行、多行模式容易出现理解错误

为什么说,容易出现理解错误呢,它们英文对应说明是:SingleLine ,MultiLine,刚好是单行、多行意思。因此,很多朋友就会从字面理解里面,得出以下结论:(哈哈、刚刚使用,我也是这些朋友中一员)

1、单行,就是从头到尾匹配,多行就是如果匹配字符串,里面有换行符,就匹配到之前

2、单行跟多行是冲突的,一次只能指定一个选项,不能同时使用

这样来理解其实,很容易就会这样的。我们来看看,官方手册里面怎么说的。

  • 单行、多行模式官方解释

模式符描述
s(单行)如果设置了这个修饰符, 模式中的点号元字符匹配所有字符, 包含换行符. 如果没有这个 修饰符, 点号不匹配换行符
m(多行)目标字符串是由单行字符组成的(然而实际上它可能会包含多行), “行首”元字符(^)仅匹配字符串的开始位置, 而”行末”元字符($)仅匹配字符串末尾。当这个修饰符设置之后, “行首”和”行末”就会匹配目标字符串中任意换行符(\n)之前或之后

 

通过上面说明,其实这2个修饰符都只是,修改正则表达式常见元字符的匹配范围了。如果加”s”修饰符,元字符”.” 将能够匹配换行符(\n),如果加”m”修饰符,元字符”$”,将只匹配到”\n”字符前;元字符”^”,将匹配到”\n”字符后。我们还是举例说明吧!(下面关于正则表达式?字符,可以看看前面一节:正则表达式(regex) 贪婪模式、懒惰模式使用)

  • 举例,看单行应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
///读取hao123.com首页
///并且去掉里面script代码
 
/**
 *去掉script标签*
 * @author chengmo
 * @copyright http://blog.chacuo.net/
 * @param string $content 原字符串 
 * @param int $style 匹配模式
 * @return string
 */
function remove_script($content,$style=1)
{
	$reg = $style == 1?"%<script.*?>.*?</script>%":"%<script.*?>.*?</script>%s";
 
	return preg_replace($reg,"",$content);
}
 
$content = file_get_contents('http://www.hao123.com');
echo remove_script($content);
1
&nbsp;
正则表达式单行匹配模式
正则表达式单行匹配模式
 
 
  • 举例,看多行应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
///读取hao123.com首页
///读取meta标签内容
 
/**
 *读取meta标签内容*
 * @author chengmo
 * @copyright http://blog.chacuo.net/
 * @param string $content 原字符串 
 * @param int $style 匹配模式
 * @return string
 */
function read_meta($content,$style=1)
{
	$reg = $style == 1?"%^<meta.*?/>%":"%^<meta.*?>\s+$%m";	
	preg_match_all($reg,$content,$arr);
	return $arr;
}
 
$content = file_get_contents('http://www.hao123.com');
var_dump(read_meta($content));
正则表达式多行
image
 
 
 
 

后记:s,m 修饰符只对,几个特殊元字符有改变。如果你正则表达式中没有那几个元字符。开启s,m字符前后将没有什么变化的。对于上面读取hao123.com代码,我们可以继续同时使用s,m模式。如:”%<script.*?>.*?(^currentProfile.*$).*?</script>%sm” ,匹配所有script标签,并且里面js代码,有一行以curentProfile开头字符串。(以下是正则表达式,单行多行一起使用)

正则表达式单行多行
  评论这张
 
阅读(408)| 评论(0)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018