正则表达式

正则表达式也叫做匹配模式(Pattern),它由一组具有特定含义的字符串组成,通常用于匹配和替换文本。

在计算机科学中,用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。

 

Python为了方便大家对于正则的使用,专门为大家提供了re模块供我们使用

1. 正则的单个字符的匹配

表1.常用的元字符

代码

说明

.

匹配除换行符(\n)以外的任意字符

\w

匹配大小写字母数字下划线或汉字0-9、a-z、A-Z、_(下划线)、汉字和其他国家的语言符号

\W

匹配非字母或数字或下划线或汉字,跟\w正好相反

\s

匹配任意的空白符 空格、tab、\n等

\S

匹配任意非空白符

\d

匹配数字

\D

匹配非数字

\b

匹配单词的开始或结束

^

匹配字符串的开始

$

匹配字符串的结束

[  ]

匹配[]中列举的字符


 1.1   .   匹配除换行符(\n)以外的任意字符

import re

t1 = re.match(".", "A")
t2 = re.match(".", "\n")
t3 = re.match(".", "_")
t4 = re.match(".", "#")
print(t1)
print(t2)
print(t3)
print(t4)

结果如下:

<_sre.SRE_Match object; span=(0, 1), match='A'>
<_sre.SRE_Match object; span=(0, 1), match='4'>
<_sre.SRE_Match object; span=(0, 1), match='_'>
None

  1.2    \w   匹配大小写字母、数字、下划线、汉字及及其他国语言

t1 = re.match("\w", "A")
t2 = re.match("\w", "4")
t3 = re.match("\w", "_")
t4 = re.match("\w", "@")
print(t1)
print(t2)
print(t3)
print(t4)

结果如下:

<_sre.SRE_Match object; span=(0, 1), match='A'>
<_sre.SRE_Match object; span=(0, 1), match='4'>
<_sre.SRE_Match object; span=(0, 1), match='_'>
None

1.2'   \W    匹配非字母、非数字、非下划线、非汉字及及其他国语言;刚好和\w相反

1.3    \s     匹配任意的空白符( 空格和制表符\t )

t1 = re.match("\s", " ")
t2 = re.match("\s", "\t")
t3 = re.match("\s", "_")
print(t1)
print(t2)
print(t3)

结果如下:

<_sre.SRE_Match object; span=(0, 1), match=' '>
<_sre.SRE_Match object; span=(0, 1), match='\t'>
None

 1.3'   \S  匹配任意的非空白符

 1.4   \d  匹配数字

t1 = re.match("\d", "1")
t2 = re.match("\d", "a")
print(t1)
print(t2)

运行结果:

<_sre.SRE_Match object; span=(0, 1), match='1'>
None

1.4'   \D    匹配非数字

1.5    \b    匹配单词的开始或结束

<span style="color:#3333ff"># 以.*开始  以liu结束
print(re.match(".*\\bliu\\b", "i is liu fas fsa5 662 2a"))</span>

运行结果:

<span style="color:#3333ff"><_sre.SRE_Match object; span=(0, 8), match='i is liu'></span>

 

2.  ^、$和 [ ]

2.1     ^     匹配字符串的开始

匹配以字符a开始的字符串

t1 = re.match("^a", "abcd")
print(t1)

结果如下:

<_sre.SRE_Match object; span=(0, 0), match=''>

 

2.2    $   匹配字符串的结束

 

匹配以天气结尾的字符串

t1 = re.match(".*天气$", "今天是个好天气")
print(t1)

结果如下:

<_sre.SRE_Match object; span=(0, 7), match='今天是个好天气'>

2.3    [ ] 匹配[ ]中列举的字符

[a-zA-Z0-9]表示匹配大小写字母或0-9中的某个字符

t1 = re.match("[a-z0-9A-Z]", "Ahehe")
print(t1)

运行结果:

<_sre.SRE_Match object; span=(0, 1), match='A'>

[a-f]表示a-f中的某个字符,2-6表示2到6中的某个字符

2.4    匹配所有的汉字

[\u4e00-\u9fa5]可以匹配所有的字符

t1 = re.match("[\u4e00-\u9fa5]", "今天是个好天气")
print(t1)

运行结果:

<_sre.SRE_Match object; span=(0, 1), match='今'>

3. 字符转义

 

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

r 可以将\转化为普通的字符,使\不在具有转义字符的功能。\\表示\ , \表示转义字符

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

t2 = re.match("c:\\\\", "c:\\a\\b")
print(t2)

t3 = re.match(r"c:\\", "c:\\a\\b")
print(t3)

t1会报错,结果就不再展示,t2、t3运行结果

<_sre.SRE_Match object; span=(0, 3), match='c:\\'>
<_sre.SRE_Match object; span=(0, 3), match='c:\\'>

4.重复

能表示对个字符的常见正则表达式如下

表2.常用的限定符

代码/语法

说明

*

重复零次或更多次

+

重复一次或更多次

?

重复零次或一次

{n}

重复n次

{n,}

重复n次或更多次

{n,m}

重复n到m次

4.1  *  匹配大于等于零个字符

* 和 .*

t1 = re.match("a*","aaabbbccc")
print(t1)
t2 = re.match("a.*","aaabbbccc")
print(t2)

运行结果如下

<_sre.SRE_Match object; span=(0, 3), match='aaa'>
<_sre.SRE_Match object; span=(0, 9), match='aaabbbccc'>

4.2  + 匹配的字符至少为一个

+ 和  .+

t1 = re.match("a+","abbbccc")
print(t1)
t2 = re.match("a.+","aaabbbccc")
print(t2)

运行结果如下

<_sre.SRE_Match object; span=(0, 1), match='a'>
<_sre.SRE_Match object; span=(0, 9), match='aaabbbccc'>

+和*是没有区别的,但 .+和 .*是有区别的

print(re.match("a.+", "a"))
print(re.match("a.*", "a"))

print(re.match("a*", "a"))
print(re.match("a+", "a"))

运行结果如下:

None
<_sre.SRE_Match object; span=(0, 1), match='a'>
<_sre.SRE_Match object; span=(0, 1), match='a'>
<_sre.SRE_Match object; span=(0, 1), match='a'>

4.3  ? 可以匹配一个字符也可以一个字符都不匹配

print(re.match("[0-9]?[\w]", "1"))
print(re.match("[0-9]?[\w]*", "aaa"))[\w]", "1"))
print(re.match("[0-9]?[\w]*", "aaa"))

运行结果:

<span style="color:#3333ff"><_sre.SRE_Match object; span=(0, 1), match='1'>
<_sre.SRE_Match object; span=(0, 3), match='aaa'></span>

4.4  {n} 匹配n个同样的字符 ;{n,} 至少匹配n个字符;{n , m}匹配n-m个字符

print(re.match("\w{5,}", "abcd"))
print(re.match("\w{5}", "abcdefghijk"))
print(re.match("\w{5,}", "abcdefghijk"))
print(re.match("\w{5,10}", "abcdefghijk"))

运行结果如下

None
<_sre.SRE_Match object; span=(0, 5), match='abcde'>
<_sre.SRE_Match object; span=(0, 11), match='abcdefghijk'>
<_sre.SRE_Match object; span=(0, 10), match='abcdefghij'>

5.  反义

 

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

表3.常用的反义代码

代码/语法

说明

\W

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

\S

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

\D

匹配任意非数字的字符

\B

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

[^x]

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

[^aeiou]

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

前三个已经说过,只介绍\B、[ ^x ] 和 [ ^aeious ]

5.1 [ ^x ]

print(re.findall("[^a]", "abcdefg"))
print(re.findall("[^abcd]", "awqcdefg"))

结果如下

['b', 'c', 'd', 'e', 'f', 'g']
['w', 'q', 'e', 'f', 'g']

6.

print(re.match(r'<(\w+)><(\w+)>.*</\2></\1>', '<html><h1>www.baidu.com</h1></html>').group())

运行结果:

<html><h1>www.baidu.com</h1></html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值