目录
Regular是什么
使用上和SQL有点像;
不同的数据库产品使用的语句都有差别,但是标准是SQL;
Regular也一样,不同的Regular引擎产品所执行的语句会有小差异,但是标准是一样的。
先认识3个对称号
will learn Regular , The best way is to remember three.
符号 | 说明 |
---|---|
[ ] | [ x ] 内是需要匹配的字符 . |
{ } | {c1,c2} 内是指定匹配字符的数量 。 |
( ) | 重复多个字符的方法 |
需要匹配的时候,区分要匹配的字符里面所有字符格式是不是都一致,不一致的话,建议从最内部的开始匹配,逐渐向外。
[ ]
[ x ] 内是需要匹配的字符 .
元字符(匹配的快捷方法)
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 [a-z0-9A-Z_] + [\u4e00-\u9fa5]“(有些引擎可能用) ” |
\s | 匹配任意的空白符 |
\d | 匹配数字 [0-9] |
\b | 匹配单词的开始或结束 ^ or $ |
下面是一些使用重复的例子:
Windows\d+
匹配Windows后面跟1个或更多数字
^\w+
匹配一行的第一个单词(或整个字符串的第一个单词,具体匹配哪个意思得看选项设置)
# ^...$
代码 | 说明 |
---|---|
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
和\b
类似;
\b
--- 代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。
字符转义
如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用.和*。当然,要查找\本身,你也得用\.
例如:unibetter\.com
匹配 unibetter.comC:\\Windows
匹配 C:\Windows
自定义字符
如果你想匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u),应该怎么办?
很简单,你只需要在方括号里列出它们就行了,像[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)。
反义字符 (大写)
有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义:
代码/语法 | 说明 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
例子:\S+匹配不包含空白符的字符串。
<a[^>]+>匹配用尖括号括起来的以a开头的字符串。
{ }
{c1,c2} 内是指定匹配字符的数量 , 贪婪与懒惰
符号 | 说明 |
---|---|
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
*? | 重复任意次,但尽可能少重复 |
+? | 重复1次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |
( )
匹配 重复多个字符的方法
上面说的都是怎么重复单个字符,就是直接在字符后门加上限定符就行了。
需求 Q:如果想重复多个字符怎么做?
A:可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了。
案例-匹配同样模式ip段:
192.168.0.1
(\d{1,3}\.){3}\d{1,3}
是一个简单的IP地址匹配表达式
请按下列顺序分析它:\d{1,3}匹配1到3位的数字,(\d{1,3}.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})
案例-多个分组 选择字符类 功能:
上面的表达式也能匹配到 256.300.888.999 这种不可能存在的IP地址,(最大255)
如果能使用算术比较的话,或许能简单地解决这个问题。
列举出正确的ip段.......
但是正则表达式中并不提供关于数学的任何功能,所以只能使用冗长的分组,选择,字符类来描述一个正确的IP地址:
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
分枝条件
我们需要用到分枝条件。正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。听不明白?没关系,看例子:
0\d{2}-\d{8}|0\d{3}-\d{7}
这个表达式能匹配两种模式:
一种是三位区号,8位本地号(如010-12345678)
一种是4位区号,7位本地号(0376-2233445)。
断言
待续...
对称压栈
待续...
案例
案例1-获取html文本里面token
html文本:
<div class="r" style="margin-top: 20px; margin-right: 0px; margin-left: 240px; padding: 0px; float: center;">
<form id="form" method="post" action="http://fjmsxw.cmbc.com.cn/feedback.html">
<input type="hidden" name="formToken" value="nyFUzIwxTKygVehq">
<div style="margin-top:10px;">
标题: <input type="text" style="line-height: 26px; height: 26px" id="title" name="title" value="" placeholder="标题"> *必填
<form:errors path="command.title" element="span" cssClass="error-label" />
</div>
code:
#1. 获取全部类似,用list返回
tokens = re.findall("value=\"(\w*?)\"", r.text)
print(tokens)
print(tokens[0])
#2. 获取全部类似,用list返回
tokens = re.findall("value=\"[\w]{16}\"", reponse2)
print(tokens)
tokens2 = tokens[0][8:-1]
print(tokens2)
// nyFUzIwxTKygVehq
案例2-获取html里面的注释
不能匹配到嵌套;
html文本:
<body>
<!-- 插件css -->
<link rel="stylesheet" type="text/css" href="https://static2.ichunqiu.com/icq/resources/css/plugin/bootstrap.min.css?v=4cd0c71d98" />
<link rel="stylesheet" type="text/css" href="https://static2.ichunqiu.com/icq/resources/css/plugin/jquery.mCustomScrollbar.min.css" />
<!-- 公共css -->
<link rel="stylesheet" type="text/css" href="https://static2.ichunqiu.com/icq/resources/css/common/component.css?v=f61ce4f93f"/>
<!-- 头部css -->
<link rel="stylesheet" type="text/css" href="https://static2.ichunqiu.com/icq/resources/css/common/header.css?v=15b4905471"/>
<!--企安殿4.0新用户登陆css-->
<link rel="stylesheet" type="text/css" href="https://static2.ichunqiu.com/icq/resources/css/company/qad/qadfyd.css"/>
<!--用户体系小I-->
<link rel="stylesheet" type="text/css" href="https://static2.ichunqiu.com/icq/resources/css/IRD/IRD-i.css?v=bb644b03ae5da915505e3f6da2d08d46"/>
<link rel="stylesheet" type="text/css" href="https://static2.ichunqiu.com/icq/resources/css/IRD/robot.css?v=bb644b03ae5da915505e3f6da2d08d46"/>
<!--[if IE 8]>
<style>
code:
<!--[\w\s.]{0,}-->
结果:
<!-- 插件css -->
<!-- 公共css -->
<!-- 头部css -->
<!--企安殿4.0新用户登陆css-->
<!--用户体系小I-->