Python 正则表达式

元字符

.       

#匹配除换行符意外任意字符(可以匹配多个,但一个"."只能匹配一个)

>>> re.match(".","12345")
<_sre.SRE_Match object; span=(0, 1), match='1'>
>>> re.match(".","_12345")
<_sre.SRE_Match object; span=(0, 1), match='_'>
>>> re.match(".....","a1b2c345")
<_sre.SRE_Match object; span=(0, 5), match='a1b2c'>
>>> re.match(".","\n12345")
>>
\d

#匹配0-9之间的数字

>>> re.match("\d","12345")
<_sre.SRE_Match object; span=(0, 1), match='1'>
>>> re.match("[0-9]","12345")
<_sre.SRE_Match object; span=(0, 1), match='1'>
\D

#匹配非数字

>>> re.match("\D","a1b2c345")
<_sre.SRE_Match object; span=(0, 1), match='a'>
>>> re.match("\D","1b2c345")
>>> re.match("\D","_a1b2c345")
<_sre.SRE_Match object; span=(0, 1), match='_'>
\w

#匹配有效字符(大小写字母,数字以及各国语言)

>>> re.match("\w","_a1b2c345")
<_sre.SRE_Match object; span=(0, 1), match='_'>
>>> re.findall("\w","a1b2c345")
['a', '1', 'b', '2', 'c', '3', '4', '5']
>>> re.findall("\w"," 中国_a1b2c345")
['中', '国', '_', 'a', '1', 'b', '2', 'c', '3', '4', '5']
\W

#匹配非有效字符(特殊符号)

>>> re.findall("\W"," 中国_a1b2\tc345")
[' ', '\t']
>>> re.findall("\W"," 中国_a1b2\nc345")
[' ', '\n']
>>> re.match("\W"," 中国_a1b2\nc345")
<_sre.SRE_Match object; span=(0, 1), match=' '>
\s

#匹配空格位(支持\t,\n)

>>> re.findall("\s","\n 空格")
['\n', ' ']
>>> re.findall("\s","\t 空格")
['\t', ' ']
>>> re.findall("\s"," 空格")
[' ']
\S

#匹配非空格位

>>> re.findall("\S"," 空格")
['空', '格']
>>> re.findall("\S","\n 空格")
['空', '格']
^

#匹配字符串的开始

>>> re.findall("^\d.*","333caisdfj453")
['333caisdfj453']
$

#匹配字符串的结束

>>> re.findall("\d.*$","333caisdfj453")
['333caisdfj453']

#以数字开头,以x结尾

>>> re.findall("\d.*x$","f333caisdfj45x")
['333caisdfj45x']
[ ]

#匹配 [] 中列举的字符

\u4e00-\u9fa5        #中文编码

>>> re.findall("[A-Za-z0-9]","f333caisdfj45x")
['f', '3', '3', '3', 'c', 'a', 'i', 's', 'd', 'f', 'j', '4', '5', 'x']
>>> re.findall("[\u4e00-\u9fa5]","中国牛逼")
['中', '国', '牛', '逼']
\b

#匹配单词的开始和结束(单词左右要有空格)

>>> re.findall(r"\bgood\b","today is good day")
['good']


转义符:

' \ ' 表示 ' \\\\ '         ===>    r "\\"

    如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没法指定它们,因为它们会被解释成其它的意思。这时你就必须使用\来取消这些字符的特殊意义。因此,你应该使用 \.和 \*。当然,要查找 \ 本身,你也得用 \\.

>>> re.match("c:\\","c:\\a\\b")        #会报错,因为\\转义后就变成了\了

<_sre.SRE_Match object; span=(0, 3), match='c:\\'>
>>> re.match(r"c:\\","c:\\a\\b")
<_sre.SRE_Match object; span=(0, 3), match='c:\\'>


重复:

常用的限定符

代码/语法

说明

*

重复零次或更多次

+

重复一次或更多次

?

重复零次或一次

{n}

重复n次

{n,}

重复n次或更多次

{n,m}

重复n到m次

下面是一些使用重复的例子:

Windows\d+匹配Windows后面跟1个或更多数字

1[356789]\d{9}匹配以13后面跟9个数字(中国的手机号)

^\w+匹配一行的第一个单词(或整个字符串的第一个单词,具体匹配哪个意思得看选项设置)

re.match("[A-Z][a-z]*","Liujianhong")

re.match("[A-Za-z]*","LiuJianhong")

re.match("[A-Z][a-z]*","LiuJianhong")

re.match("[a-zA-Z_]+[\w_]*","LiuJianhong3")

re.match("[0-9]?[\d]","1")

re.match("[0-9]?[\d]","111")

re.match("\w{5}","1sadfasdf11")

re.match("\w{5,}","1sadfasdf11")

re.match("\w{5,9}","1sadfasdf11")

re.match(".*\\bliu\\b","i isliu fas fsa5 662 2a")     # 注意为什么使用点

re.match(r".*\bliu\b","iis liu fas fsa5 662 2a")       # 结果同上



反义

有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义:

常用的反义代码

代码/语法

说明

\W

匹配任意不是字母,数字,下划线,汉字的字符

\S

匹配任意不是空白符的字符

\D

匹配任意非数字的字符

\B

匹配不是单词开头或结束的位置

[^x]

匹配除了x以外的任意字符

[^aeiou]

匹配除了aeiou这几个字母以外的任意字符

案例如下:

re.match("[^abcd]","a")  #表示除a、b、c、d外的任何字符都匹配

 

re.match("[^abcd]","b")

 

re.match("[^abcd]","e")

 

分组

     我们已经提到了怎么重复单个字符(直接在字符后面加上限定符就行了);但如果想要重复一个字符串又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作。

 

         案例如下:

re.match("100|[1-9][0-9]|[0-9]","2") # 匹配100以内的数

 

re.match("100|[1-9]?\d$","2")   

 

re.match("\d+(183|192|168)\s","452183 ")

re.match("\d+(183|192|168)\s","452183 ").group()

re.match("\d+(183|192|168)\s","452183 ").group(1) #注意当输入1的结果

re.match("\d+(183|192|168)\.(li|wang|liu)","452168.wang").group(2)

 

re.match("(.*)-(\d+)","0931-5912872 ").group(2) #小括号的使用场景,特别方便

 

re.match("<[a-zA-Z]*>\w*</[a-zA-Z]*>","<a>liujianhong</a>") #看似正确,其实Error

 

re.match("<[a-zA-Z]*>\w*</[a-zA-Z]*>","<a>liujianhong</html>") #这个就是漏洞

 

re.match(r"<([a-zA-Z] *)>\w*</ \1>","<a>liujianhong</html>") #此时\1表示第一个括号中的值

 

re.match("<([a-zA-Z] *)>\w*</ \\1>","<a>liujianhong</html>") #这样也行

 


re模块的高级应用

1、search

#执行正则表达式搜索并且在搜索结束后返回所匹配到的串,只返回第一次匹配到的结果

>>> res = re.search(r"\d+","浏览量333")
>>> res.group()
'333'
2、findall

#匹配所有对象,返回一个列表

>>> re.findall(r"\d+","当前浏览量888,回帖人数222")
['888', '222']
3、sub

#实现查找替换

>>> re.sub(r"\d+","1024","当前浏览量8848次")
'当前浏览量1024次'





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值