一、正则表达式基本定义
正则表达式,又称规则表达式(Regular Expression , RE),是计算机科学的一个概念;它描述了一种字符串匹配的模式,通过这样的模式对字符串进行搜索、匹配和替换等操作。下面我们就列举常规正则表达、字符搜索、字符替换及分割以及表达式修饰符进行简单描述。
二、常规正则表达式列举
通配符 | 释义 | 正则表达式举例 | 匹配结果(可能出现) |
xxx|yyy | 匹配正则表达式xxx或yyy | xxx|yyy | None或者xxx或者yyy; |
. | 匹配任何字符(\n除外) | xxx. | None或者xxx任意字符 |
^ | 匹配字符串起始部分 | ^a | a…… |
$ | 匹配字符串终止部分 | .txt$ | s.txt |
* | 匹配0次或者多次出现前面的正则表达式 | a* | ……aaaaaa…… |
+ | 匹配1次或者多次出现前面的正则表达式 | a+ | ……aaaaaa…… |
? | 匹配0次或者1次出现前面的正则表达式 | one? | ……one…… |
{N} | 匹配N次出现前面的正则表达式 | a*.c{2} | ……a[a-z]c…… |
{N,M} | 匹配N至M次出现前面的正则表达式 | a*.c{2,3} | ……a[a-z]cc…… |
[…] | 匹配字符集中的任意一字符 | [abc] | 匹配abc中的一个 |
[…x-y…] | 匹配x至y间的任意一字符 | [a-z] | 匹配a-z中的任一个 |
[^…] | 不匹配次字符集中的任意单个字符 | [^abc] | 匹配的结果不会包含abc |
(…) | 匹配封闭的正则表达式,然后另存为子组 | ([a-c][1-2]) | ……c1…… |
\d | 匹配任何十进制数字 | \d | 1 |
\w | 匹配任何字母数字字符 | \w{3} | 12a |
\s | 匹配任何空格字符 | b\sb | b b |
\b | 匹配任何单词边界 | ||
\N | 匹配已保存的子组 | ([0-9])\9 | 9 |
\. | 匹配“.”字符 | a\.txt | a.txt |
常用正则表达式 | |||
正则表达式 | 释义 | 匹配内容 | |
\d+(\.\d*)? | 任意整数和浮点数 | 0.006 2 75 | |
\b[^\Wa-z0-9_][^\WA-Z0-9_]*\b | 首字母只能大写 | Boo Foo | |
^http:\/\/([\w-]+(\.[\w-]+)+(\/[\w-.\/\?%&=\u4e00-\u9fa5]*)?)?$ | 验证网址 | http://www.baidu.com/?id=1 | |
^[\u4e00-\u9fa5]{0,}$ | 验证汉字 | 测试 | |
\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* | 验证电子邮件 | example@163.com | |
^[1-9]([0-9]{16}|[0-9]{13})[xX0-9]$ | 身份证 | 110101195910231000 | |
^13[0-9]{1}[0-9]{8}|^15[9]{1}[0-9]{8} | 手机号 | 13000000000 | |
^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$ | 验证IP | 192.168.1.4 | |
^[a-zA-Z0-9]+([a-zA-Z0-9\-\.]+)?\.s|)$ | 验证域名 | baidu.com | |
^([a-zA-Z]\:|\\)\\([^\\]+\\)*[^\/:*?"<>|]+\.txt(l)?$ | 验证文件路径 | C:\users\app | |
<(.*)>(.*)<\/(.*)>|<(.*)\/> | HTML标签匹配 |
三、字符搜索
python中关于RE模块对于字符的搜索常用的4个方法:match()、search()、findall()、finditer();match()是从字符串的开始进行匹配;而search()是对字符串的任意位置进行匹配;这两个均是只搜索匹配一处字符串;而findall()、finditer()是满足你需要匹配多处字符串时的函数;其中,findall()匹配结果返回的是一个List类型的数据,finditer()匹配结果返回的是一个迭代器;(finditer的性能要好于findall)另:span()可以取出匹配结果在匹配目标字符串中的索引;match()属性可以取出结果;如下图:
#!usr/bin/env python
# -*- coding:utf-8 -*-
import re
str000 = "Hello Tester,Good Tester!"
str0000 = "Tester is a good people!"
res0 = re.match("Tester", str000)
res1 = re.match("Tester", str0000)
print(res0) # --->None
print(res1) # ---><_sre.SRE_Match object; span=(0, 6), match='Tester'>
print(res1.group()) # --->Tester
######################################################################################
res00 = re.search("Tester", str000)
res01 = re.search("Tester", str0000)
print(res00) # ---><_sre.SRE_Match object; span=(6, 12), match='Tester'>
print(res01) # ---><_sre.SRE_Match object; span=(0, 6), match='Tester'>
print(res00.group()) # --->Tester
print(res01.group()) # --->Tester
######################################################################################
res000 = re.findall("Test..", str000)
print(res000) # --->['Tester', 'Tester']
res001 = re.finditer("Test..", str000)
print(res001) # ---><callable_iterator object at 0x0000019AC0F08B70>
# 分别打印两个Tester
for i in res001:
print(i.group())
四、字符替换和分隔
替换:re.sub(正则,"替换值","目标字符串",n ),释义:从“目标字符串”中匹配“正则”,替换为“替换值”,替换次数为n次,次数可以不填,默认匹配的所有。
分隔:re.split(正则,"目标字符串",n),释义:从“目标字符串”中匹配“正则”,匹配的内容换成分隔符“,”,分隔次数n次,次数可以不填,默认匹配的全部。
#! usr/bin/env python
# -*-coding:utf-8 -*-
import re
str000="She is a beautiful girl ,she is good and honest."
#替换
print(re.sub(r"\w*is\w*","are",str000))#--->She are a beautiful girl ,she are good and honest.
print(re.sub(r"\w*is\w*","are",str000,1))#--->She are a beautiful girl ,she is good and honest.
#分隔
print(re.split(r"\w*is\w*",str000))#--->['She ', ' a beautiful girl ,she ', ' good and honest.']
print(re.split(r"\w*is\w*",str000,1))#--->['She ', ' a beautiful girl ,she is good and honest.']
五、表达式修饰符
表达式修饰符 | |
re.I(re.IGNORECASE) | 忽略大小写 |
re.M(re.MULTILINE) | 多行模式,改变“^”和“$”的行为 |
re.S(re.DOTALL) | 点任意匹配模式,改变“.”的行为,设置后可以匹配\n |
re.L(re.LOCALE) | 使预定字符类\w\W\b\B\s\S取决于当前区域设定 |
re.U(re.UNICODE) | 使预定字符类\w\W\b\B\s\S\d\D取决于unicode定义的字符属性 |
re.X(re.VERBOSE) | 详细模式。该模式下正则表达式可以是多行,忽略空白字符,并可以加入注释 |
表达式修饰符使用方式 | |
re.compile(pattern,string,flags=表达式修饰符) | flags可以不填,但填了就要按照修饰符设置的意义来匹配 |
re.findall(pattern,string,flags=表达式修饰符) | |
re.match(pattern,string,flags=表达式修饰符) | |
re.search(pattern,string,flags=表达式修饰符) |
import re
str000="She is a beautiful girl ,she is good and honest."
res=re.findall(r"\W*she\W*",str000,flags=re.I)##['She', 'she']
六、预编译、贪婪匹配
前面所表述的匹配都没有预编译,RE的预编译指的是对pattern内容进行预编译,其作用是减少匹配时编译pattern的次数,从而提高匹配性能。贪婪匹配,默认情况下,都是贪婪匹配;指的是在默认情况下对于复数匹配符来说,他们会尽可能的匹配到最后一个符合条件的字符。而对非贪婪匹配,则是匹配到第一个符合条件的字符即可。
备注:非贪婪匹配模式中的“?”必须放在复数匹配符后面,同时在被限定字符前面;复数匹配符可以是“*”或“+”
#! usr/bin/env python
# -*-coding:utf-8 -*-
import re
str000="She is a beautiful girl ,she is good and honest."
pattern="\w*she\w*"
p=re.compile(pattern,flags=re.I)
res=p.search(str000)
str0000="<html><head></head></html>"
print(re.search(r"^<.*>",str0000).group())##<html><head></head></html>
print(re.search(r"^<.*?>",str0000).group())##<html>