正则表达式30分钟wiki
正则表达式30分钟wiki
摘要
文档预期在30分钟内起到提纲挈领,梳理原理,帮助快速记忆和应用的效果。
一、简介
正则表达式,Regular Expression 符合规则的表达式。
目的:即过滤出一些指定句法规则的字符串。
是什么?:一种文本模式
和python的关系:python语言提供一个接口或者叫接口模块,在编程中控制运用正则表达式。
python 模块名为re import re
二、元素
2.1 普通字符
26个英文字母(大小写),数字,一般符号- * .
2.2 元字符
其中细化分为,替代字符 ,计算符 ,格式符
注意,转换符 \,很常用,将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。
死对头,r,含义raw,遵从字符串最原生的样式忽略转义和符号特殊含义。python中常用,filename = r‘D:\tests.txt’ 若不加r,则不能匹配到这个文件名。
1)替代字符
最基础 [ ],[a-z] a到z26个小写字母,- 代替之间默认的元素(理解为“或”,候选)注意匹配个数为1个字母。| 代表或,可以不与[ ]一起用,‘acd|b’,acd或b
"或"操作
字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。
(常用) . 点 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用像"(.|\n)"的模式。
用符号代替[ ]
\w 字母数字下划线,w代表word
\d 数字,d代表digit
【例题1】:匹配abc或abd : 答案 ab[c|d]
2)计算符(限制符)
最基础 { },{3}表示3个,{1,3}表示1到3个
【例题2】: 匹配1000或10000,或100000
【例题3】: ‘121111101010111111011101110101010’匹配10或1010或101010
用符号代替{}
| ? | * | + |
{} {0,1} {0,n} {1,n} 记忆:+ 取0没变化,所以从1开始
含义 0-1 0到无穷大 1到无穷大
3)格式符
\t 制表符,t为table,\为转换符
\s 空格符,s为space (常用)
\r 回车符,r为enter
\n 换行符,有些文档版本为\r\n
\b 边界符,b为boundary
注意,\S,\B为取反向含义
注意,贪不贪?,用问号?,当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
三 语法
和创建数学表达式的方法一样。用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。\w+\dabc(.*)
正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。例子:\w{2}
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。
更多内容,^ 和 $ ,反向引用\1,\2 参阅:http://www.runoob.com/regexp/regexp-syntax.html
常用匹配:
1)匹配文档中所有IP,10.143.198.12,正面硬刚:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
参考材料:
正则表达式教程:http://www.runoob.com/regexp/regexp-tutorial.html
四 python re模块
对数据的操作,基本四大步骤,增删改查。正则表达式对字符串也大概如此。
4.1 准备
1) 模块re
import re
2) 是否编译
pattern = re.compile(规则字符串) 一般不要求十分严格的话,不用提前编译。
pattern = ‘规则字符串’
4.2 查找
1)findall
2)search 返回对象 从前向后找,找到一个绝对不找第二个 (常用,groups重用,效果不好时用findall)
3)match 返回对象 只找开头的。
import re
str = "Is is the cost of of gasoline going up up "
patt1 = '\w{2}'
l = re.findall(patt1,str)
print l #返回list
a = re.search(patt1,str)
print a #返回一个正则对象
a1 = a.group() #获取内容必须找组织,group和groups,groups必须规则中有()
print a1
a2 = a.groups()
print a2 #groups必须规则中有()
str = "Is is the cost of of gasoline going up up "
patt1 = '(\w{2})(\w{3})'
a = re.search(patt1,str)
a1 = a.group()
a2 = a.groups() #groups 按照两部来匹配,把括号打开整体匹配后,按照小括号,拆开放置在元组中返回。
print a1,a2
结果:
['Is', 'is', 'th', 'co', 'st', 'of', 'of', 'ga', 'so', 'li', 'ne', 'go', 'in', 'up', 'up']
<_sre.SRE_Match object at 0x00000000030FA510>
Is
()
gasol ('ga', 'sol')
4.3 替换
sub 和 subn,区别是还会返回一个n 替换的个数
import re
str = "Is is the cost of of gasoline going up up "
patt1 = '\w{3}'
a = re.sub(patt1,'----------',str)
print a
a = re.subn(patt1,'----------',str)
print a
#结果
Is is ---------- ----------t of of --------------------ne ----------ng up up
('Is is ---------- ----------t of of --------------------ne ----------ng up up ', 5)
补充 分割re.split()
浙公网安备 33010602011771号