python技术

day30(正则表达式)

2017-12-01  本文已影响20人  冰封心动

正则表达式

正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。

Regular Expression的“Regular”一般被译为“正则”、“正规”、“常规”。此处的“Regular”即是“规则”、“规律”的意思,Regular Expression即“描述某种规则的表达式”之意。

re模块

在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个模块,名字为re。

re.match是用来进行正则匹配检查的方法,若字符串匹配正则表达式,则match方法返回匹配对象(Match Object),否则返回None(注意不是空字符串"")。

匹配对象Macth Object具有group方法,用来返回字符串的匹配部分。

import re

#match从开头匹配,如果没有返回None

ret = re.match('w','www.baidu.com')

print(ret)

print(ret.group())

表示字符

.点匹配任意一个字符

[]匹配[]里边任意一个字符

\d匹配一个数字

\D匹配一个非数字

\s匹配一个空白,空格 Tab键

\S匹配一个非空白

\w匹配一个单词字符,中文,A-Z,a-z,0-9,_

\W匹配一个非单词字符,中文,A-Z,a-z,0-9,_

[\u4e00-\u9fa5]中文

\表示转义

r只对\有用

例如:

import re

#.点匹配任意一个字符

ret = re.match('.','1www.baidu.com')

print(ret)

print(ret.group())

表示数量

*匹配前一个字符出现0次或者无限次

 +匹配前一个字符出现1次或者无限次

 ?匹配前一个字符出现1次或者0次

 {m}匹配前一个字符出现m次

 {m,}匹配前一个字符至少出现m次

 {m,n}匹配前一个字符出现m到n次

例如:

import re

ret = re.match(r'e*','ererrtrrfdgwc:\\a\\b')

print(ret)

print(ret.group())

表示边界:

^匹配字符串开头

$匹配字符串结尾

\b匹配字符串边界

\B匹配非字符串边界

例如:

import re

#^匹配字符串开头

ret = re.search(r'^err','errderrtrrfdgwc:\\a\\b')

print(ret)

print(ret.group())

匹配分组

[^a-z]表示除了a-z

|匹配左右任意一个表达式

(ab)将括号中字符作为一个分组

\num引用分组序号num匹配到的字符串

(?P)给分组起别名

(?P=name)引用别名为name的分组匹配到的字符串

例如:

import re

#(?P)给分组起别名

ret = re.match(r'<(?P\w+)>(\w+)','haha')

print(ret)

print(ret.group(1))

print(ret.group(2))

re模块的高级用法

match 方法:从起始位置开始查找,一次匹配

search 方法:从任何位置开始查找,一次匹配

findall 方法:全部匹配,返回列表

finditer 方法:全部匹配,返回迭代器

split 方法:分割字符串,返回列表

sub 方法:替换

贪婪和非贪婪

Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;

非贪婪则相反,总是尝试匹配尽可能少的字符。

在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪。

import re

#贪婪和非贪婪

pattern = re.compile(r'(.+)(\d+-\d+-\d+-\d+)')

ret = pattern.match('This is a number 234-235-22-423')

print(ret)

print(ret.group())

print(ret.group(1))

print(ret.group(2))

print('*****************************')

pattern = re.compile(r'(.+?)(\d+-\d+-\d+-\d+)')

ret = pattern.match('This is a number 234-235-22-423')

print(ret)

print(ret.group())

print(ret.group(1))

print(ret.group(2))

结果:

<_sre.SRE_Match object; span=(0, 31), match='This is a number 234-235-22-423'>

This is a number 234-235-22-423

This is a number 23

4-235-22-423

*****************************

<_sre.SRE_Match object; span=(0, 31), match='This is a number 234-235-22-423'>

This is a number 234-235-22-423

This is a number

234-235-22-423

上一篇下一篇

猜你喜欢

热点阅读