Python使用Regular入门


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.com
C:\\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;">
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;标题: <input type="text" style="line-height: 26px; height: 26px" id="title" name="title" value="" placeholder="标题">&nbsp;*必填
                        <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-->

转载于:https://www.cnblogs.com/mysticbinary/articles/10766831.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值