正则表达式
1. 通配符
点号可以匹配除了换行符外的任何单个字符。
特殊字符要转义
前面加\
2. 字符集
用中括号括住字符串来创建字符集。字符集能匹配它包括的所有字符。只能匹配一个字符。
'[^abc]' # 可以匹配除了abc之外的字符
3. 选择符和子模式
'p(ython|erl)' # 匹配两个字符串
4. 可选项和重复子模式
在子模式后面加上问号,就变成可选项。
r'(http://)?(www\.)?python\.org'
能匹配到下列字符串而没有其他模式:
'http://www.python.org'
'http://python.org'
'www.python.org'
'python.org'
可选子模式互相独立。
每个可选子模式都用圆括号括起来。
使用原始字符串减少反斜线的数量。
对点好做了转义,防止它成为通配符使用。以下运算符可以允许子模式重复多次:
(pattern)*:重复零次以上
(pattern){m,n}:重复m-n次
(pattern)+:重复一次以上
'^ht+p'只在字符串开头而不是其他位置匹配
$字符串结尾用$标记
- 常见正则:
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
re模块内容
1.compile
re.compile(pattern[,flags])
将含正则表达式的字符串的转换为模式对象。
第二个参数flag是匹配模式,取值可以使用按位或运算符’|’表示同时生效,比如re.I | re.M。另外,你也可以在regex字符串中指定模式,比如re.compile(‘pattern’, re.I | re.M)与re.compile(‘(?im)pattern’)是等价的。
可选值有:
re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
M(MULTILINE): 多行模式,改变’^’和’$’的行为
S(DOTALL): 点任意匹配模式,改变’.’的行为
L(LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定
U(UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性
X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。以下两个正则表达式是等价的:
2.search
search(pattern,string[,flags])
在给定字符串中寻找第一个匹配的子串,一旦给定,就返回MatchObject(真值),否则返回false。函数在字符串内查找模式,直到找到第一个就退出,查找不到返回None,其参数和re.match一致。而与match的区别在于,match只是匹配字符串的开始,而search匹配整个字符串
3.match
match(pattern,string[,flags])
re.match从字符串的开始匹配一个模式,第一个参数是正则表达式,第二个字符串是要匹配的字符串,第三个参数是标志位,缺省为0;如果可以查找到则返回一个match对象,否则返回None。
>>> import re
>>> re.match("c","cdkfje")
<_sre.SRE_Match object at 0x00000000027D2D30>
>>> re.search("c","abcdef")
<_sre.SRE_Match object at 0x00000000027D2B28>
4.findall
re.findall(pattern,string)
可以获取所有匹配的字符串,并且以list形式返回。
5.split
re.split(pattern,string[,count=0])
会根据模式匹配分割字符串
6.escape
escape(string)
字符串的正则式:前面加r
例如查找标点符号:
>>> text = '"hm...err -- are you suere ? "he said ,sountg ing.'
>>> import re
>>> pat = r'[.?/,"]+'
>>> re.findall(pat,text)
['"', '...', '?', '"', ',', '.']
7.分组
re模块中能够匹配时,会返回MatchObject对象。他们还包含匹配了子字符串哪部分的信息。称为group。
简单说,group就是圆括号内的子模式。group的序号取决于它左侧的括号数。小组是从左向右计数的,从1开始。组可以被嵌套。计数的数值可以能过从左到右计算打开的括号数来确定。
>>>p=re.compile('(a(b)c)d')
>>> m = p.match('abcd')
>>> m.group(0)
'abcd'
>>> m.group(1)
'abc'
>>> m.group(2)
'b'
- 对MatchObject类的方法有:
group ([序号]) 获取给定组的匹配项
start()默认0是整个组,从1开始索引
end()
span()返回一个组的开始和结束位置
8.sub
作为替换组号和函数
re.sub()
sub(replacement, string[, count = 0])
对于输入的一个字符串,利用正则表达式(的强大的字符串处理功能),去实现(相对复杂的)字符串替换处理,然后返回被替换后的字符串