Python 学习之路 - 正则表达式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 学习之路 - 正则表达式相关的知识,希望对你有一定的参考价值。
正则表达式
正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。
re 模块用于正则表达式的操作。
一、 用于匹配的函数
1. findall(pattern,string,flags=0)
匹配字符串中所有符合条件的元素。匹配上,返回list类型元素
import re obj = re.findall(‘\\d+‘,‘hhh90080mmmbb2233pp‘) print(obj)
2. match(pattern,string,flags=0)
从字符串起始位置匹配符合条件的元素,单个匹配。匹配上,返回一个对象
注意:字符串起始位置的元素必须与正则表达式相匹配,不然返回None
import re obj = re.match(‘\\d+‘,‘0008lkk‘) print(obj,type(obj)) if obj: print(obj.group())
3. search(pattern,string,flags=0)
在字符串中寻找匹配的元素,单个匹配。匹配上,返回一个对象
import re obj = re.search(‘\\d+‘,‘hhh90080mmmbb2233pp‘) if obj: print(obj.group())
4. group()和groups()
分组是用()进行的,一个正则表达式可以用括号进行分组
group()获得一个,多个分组截获的字符串;或所有分组匹配的整体字符串
groups()以元组形式返回全部分组截获的字符串
import re a = "123abc456ooo" print( re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(0)) #编号0代表整个匹配的子串;不填写参数时,相当于group(0) print( re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(1,2)) #指定多个参数时将以元组形式返回 (‘123‘, ‘abc‘) print(re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(2)) #指定一个参数时返回字符串 abc print (re.search("([0-9]*)([a-z]*)([0-9]*)", a).groups()) #(‘123‘, ‘abc‘, ‘456‘)
5. sub(pattern, repl, string, count=0, flags=0)
替换与正则表达式相匹配的字符串
import re s = "hello world 001,789 welcome" s_c = re.sub(‘\\d+‘,‘amy‘,s,1) #只替换一次,不填count会全部替换 print(s_c)
比str.replace()更加强大。
6. split(pattern,string,maxsplit=0,flag=0)
根据指定的正则匹配进行分割。
注意:最后一个字符匹配成功的话,会分割出一个空格
import re n = "split1nnnnn2mmmmm3" n_c = re.split(‘[0-9]‘,n,1) #最多分割一次,不填maxsplit会全部分割 print(n_c)
7. compile(strPattern[, flag])
将字符串形式的正则表达式编译为一个对象。
import re text = "You are so cool, oo" pattern = re.compile(r‘\\w*oo\\w*‘) #将正则表达式编译成Pattern对象 print(pattern.findall(text)) #查找所有包含oo的单词,使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
二、匹配的语法
语法 | 说明 | 表达式实例 | 匹配的字符串 |
字符 | |||
一般字符 | 匹配自身 | abc | abc |
. |
匹配任意字符(除换行符) 若指定flag DOTALL,则匹配任意字符,包括换行 |
a.c | akc |
\\ | 转义字符,使其后的字符变成字面上的字符 | a\\.c | a.c |
[...] | 字符集,[a*]匹配字符是a 或 *;’[a-z]匹配a到z之间的任意字符; [^f]匹配非 f 的任意字符;[\\d]匹配数字. 字符集中除了 - ^ \\ 外,其他特殊字符没有特殊含义 |
[a*]k |
aK *k |
数量(用在字符或(...)之后) | |||
* | 匹配前一个字符0或无限次 | ||
+ | 匹配前一个字符1或无限次 | ||
? | 匹配前一个字符0次或1次 | ||
{m} | 匹配前一个字符m次 | ||
{m,n} | 匹配前一个字符m到n次,省略m,0到n;省略n,m到无限 | ||
预定义字符(可以写在[]字符集中) | |||
\\d | 数字:[0-9] | ||
\\D | 非数字:[^\\d] | ||
\\w | 字母数字下划线:[A-Za-z0-9_] | ||
\\W | [^\\W] | ||
边界匹配 | |||
^ | 匹配字符串开头 | ^abc | abc |
$ |
匹配字符串结尾 | abc$ |
abc |
\\A |
仅仅匹配字符串开头 |
\\Aabc | abc |
\\Z | 仅仅匹配字符串结尾 | abc\\Z | abc |
\\b | 匹配\\w和\\W之间;单词的开始或结束 | a\\b!bc | a!bc |
\\B | [^\\b] | a\\Bbc | abc |
逻辑,分组 | |||
| | |代表左右表达式任意匹配一个。从左 往右匹配,左边的匹配成功便跳过右边 |
abc|def | abc dfe |
(...) | 被括起来的表达式将作为分组;分组表 达式作为一个整体,后面可以接数量。表达式 中的 | 只在该组中有效。 从表达式的左边开始没遇到一个分组的左括号, 编号就加1 |
(abc){2} a(123|456)c |
abcabc a456c |
三、flag
# flags I = IGNORECASE = sre_compile.SRE_FLAG_IGNORECASE # ignore case L = LOCALE = sre_compile.SRE_FLAG_LOCALE # assume current 8-bit locale U = UNICODE = sre_compile.SRE_FLAG_UNICODE # assume unicode locale M = MULTILINE = sre_compile.SRE_FLAG_MULTILINE # make anchors look for newline S = DOTALL = sre_compile.SRE_FLAG_DOTALL # make dot match newline X = VERBOSE = sre_compile.SRE_FLAG_VERBOSE # ignore whitespace and comments
四、r 原生字符
正则表达式里使用"\\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\\\"表示。同样,匹配一个数字的"\\\\d"可以写成r"\\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。
学习内容来自:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
以上是关于Python 学习之路 - 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章