字符匹配
1 - 普通字符
大多数字母和字符一般都会和自身匹配,如正则表达式test会和字符串‘test’完全匹配
2 - 元字符 ^ $ * + ? {} [] \ | ()
1) [ ]
常用来匹配一个字符集:[abc]; [a-z
元字符在 [] 中不起作用:[akm$]
补集匹配不在区间范围内的字符: [^5]
从给定的字符串中查找符合规则的数据
>>> import re
>>> s = r'abc'
>>> re.findall(s,'aaaaaaaaaaaaaa')
[]
>>> re.findall(s,'abcaaaaaaaaaaaaabcaaaaaaaabc')
['abc', 'abc', 'abc']
>>>
>>> st = 'top tip tqp twp tep'
>>> res = r'top'
>>> re.findall(res,st)
['top']
>>> res = r'tip'
>>> re.findall(res,st)
['tip']
查找给定字符串中是否包含tip或者top(t开头p结尾,中间是i或者o)
>>> res = r't[io]p'
>>> re.findall(res,st)
['top', 'tip']
查找除了tip和top之外的字符串 - 取反
>>> res = r't[^io]p'
>>> re.findall(res,st)
['tqp', 'twp', 'tep']
>>>
2) ^匹配行首
>>> s = 'hello world,hello boy'
>>> r = r'hello'
>>> re.findall(r,s)
['hello', 'hello']
>>> r = r'^hello'
>>> re.findall(r,s)
['hello']
>>>
3) $匹配行尾
>>> r = r'boy$'
>>> re.findall(r,s)
['boy']
>>>
3) \ 反斜线后面可以加不同的字符以表示不同特殊意义,也可以用于取消所有的元字符: \[ 或 \\
\d 匹配任何十进制数;它相当于类[0-9]
>>> r = r'[0-9]'
>>> re.findall(r,'012325436548768568')
['0', '1', '2', '3', '2', '5', '4', '3', '6', '5', '4', '8', '7', '6', '8', '5', '6', '8']
>>> r=r'\d'
>>> re.findall(r,'012325436548768568')
['0', '1', '2', '3', '2', '5', '4', '3', '6', '5', '4', '8', '7', '6', '8', '5', '6', '8']
>>>
\D 匹配任何非数字字符;它相当于类[^0-9]
\s 匹配任何空白字符;它相当于类 [\t\n\r\f\v]
\S 匹配任何非空白字符; 它相当于类[^\t\n\r\f\v]
\w 匹配任何字母数字字符;它相当于类[a-zA-Z0-9_]
\W 匹配任何非字母数字字符; 它相当于类[^a-zA-Z0-9_]
\转义^
>>> r = r'\^abc'
>>> re.findall(r,'^abc ^abc ^abc')
['^abc', '^abc', '^abc']
>>>
4) 重复:正则表达式第一宫内就是能够匹配不定长的字符集,另一个功能就是你可以指定正则表达式的一部分的重复次数
>>> r = r'^010-\d\d\d\d\d\d\d\d'
>>> re.findall(r,'010-87654321')
['010-87654321']
>>> r = r'^010-\d{8}'
>>> re.findall(r,'010-87654321')
['010-87654321']
>>>
5) * :指定前一个字符可以被匹配零次或更多次,而不是只有一次。匹配引擎会试着重复尽可能多的次数(不超过整数界定范围,20亿)
a[bcd]*b-- 'abcdb'
>>> re.findall(r,'a')
['a']
>>> re.findall(r,'ab')
['ab']
>>> re.findall(r,'abbbbbbbbbbbbbbb')
['abbbbbbbbbbbbbbb']
>>>
6) +:表示匹配一次或多次
>>> r = r'ab+'
>>> re.findall(r,'a')
[]
>>> re.findall(r,'abbbb')
['abbbb']
>>>
7) ?:匹配一次或零次,可以用来标识某事物是可选的,可有可无的。或者最小匹配(贪婪模式,非贪婪模式)
允许 - 可以出现或者不出现,不能出现多次
>>> r = r'^010-?\d{8}$'
>>> re.findall(r,'010--87654321')
[]
>>> re.findall(r,'010--87654321')
[]
>>> re.findall(r,'010876543219')
[]
>>> re.findall(r,'01087654321')
['01087654321']
>>> re.findall(r,'010-87654321')
['010-87654321']
>>>
贪婪匹配,最大的匹配
>>> r = r'ab+'
>>> re.findall(r,'abbbbbbbbbbb')
['abbbbbbbbbbb']
>>>
非贪婪匹配,最小的匹配
>>> r = r'ab+?'
>>> re.findall(r,'abbbbbbbbbbb')
['ab']
>>>
8) {m,n} :至少重复m次,至多重复n次。m和n是十进制数。该限定符的意思是至少有m个重复,至多到n个重复。 a/{1,3}b
忽略m会认为下边界是0,而忽略n的结果将是上边界无穷大(实际上是20亿)
{0,}等同于*, {1,} 等同于+,而{0,1}则与?相同。如果可以的话,最好用*,+ 或?
>>> r = r'a{1,3}'
>>> re.findall(r,'a')
['a']
>>> re.findall(r,'aa')
['aa']
>>> re.findall(r,'b')
[]
>>> re.findall(r,'aaab')
['aaa']
>>> re.findall(r,'ababa')
['a', 'a', 'a']
>>>
>>> r1 = r'\d{3,4}-?\d{8}'
>>> re.findall(r1,'010-874654321')
['010-87465432']
>>> p_tel = re.compile(r1)
>>> print(p_tel)
re.compile('\\d{3,4}-?\\d{8}')
>>>
>>> p_tel.findall('010-87654321')
['010-87654321']
>>> a_re = re.compile(r'abcd',re.I)
>>> a_re.findall('ABCDabcd')
['ABCD', 'abcd']
>>> a_re.match('abcd hello')
<_sre.SRE_Match object; span=(0, 4), match='abcd'>
>>> a_re.match('hello')
>>>
>>> x = a_re.match('hello')
>>> if x:
... pass
...
>>>
>>> a_re.search('abcd')
<_sre.SRE_Match object; span=(0, 4), match='abcd'>
>>> a_re.search('abcdeabcd')
<_sre.SRE_Match object; span=(0, 4), match='abcd'>
>>> a_re.search('deaabcdeabcd')
<_sre.SRE_Match object; span=(3, 7), match='abcd'>
>>>
>>> a_re = re.compile(r'abcd',re.I)
>>> a_re
re.compile('abcd', re.IGNORECASE)
>> x = a_re.finditer('abcsafaabcdefwefBCDEEF')
>>> x.__next__()
<_sre.SRE_Match object; span=(7, 11), match='abcd'>
>>>
>>> y = a_re.match('abcd hello')
>>> y.group()
'abcd'
>>> y.group(1)
Traceback (most recent call last):
File "", line 1, in
IndexError: no such group
>>> y.group(0)
'abcd'
>>>
p = re.compile(... )
m = p.match('string goes here')
if m:
print('match found:', m.group())
else:
print('not match')
>>> rs = r'h...o'
>>> re.sub(rs,'python','hello hallo hawwl')
'python python hawwl'
>>> re.subn(rs,'python','hello hallo hawwl')
('python python hawwl', 2)
>>> ip = '192.168.1.1'
>>> ip.split('.')
['192', '168', '1', '1']
>>> s = '123+456-789*125'
因为+-*符号在元字符串中,要转义
>>> re.split(r'[\+\-\*]',s)
['123', '456', '789', '125']
>>>
>>> s = '''
... hello world
... world hello
... hello world hello
... world here
... '''
>>> s
'\nhello world\nworld hello\nhello world hello\nworld here\n'
>>> r = r'^world'
>>> re.findall(r,s)
[]
>>> re.findall(r,s,re.M)
['world', 'world']
>>> tel = r'''
... \d{3,4}
... -?
... \d{8}
... '''
>>> re.findall(tel,'010-12345678')
[]
>>> re.findall(tel,'010-12345678',re.X)
['010-12345678']
>>>
>>>
>>> email = r'\w{3}@\w+(\.com|\.cn)'
>>> re.match(email,'[email protected]')
<_sre.SRE_Match object; span=(0, 11), match='[email protected]'>
>>> re.match(email,'[email protected]')
<_sre.SRE_Match object; span=(0, 11), match='[email protected]'>
>>> re.match(email,'[email protected]')
<_sre.SRE_Match object; span=(0, 10), match='[email protected]'>
>>> re.match(email,'[email protected]')
>>>
>>> re.findall(email,'[email protected]')
['.com']
>>>
>>> s = '''
... hhsdj fsdg hello src=python yes fsdgfsdg
... sfgsg src=123 yes dfsfg
... src=2423 yes fs
... hello src=yyyyy1 yes fdsgs
... '''
>>> r1 = r'src=(.+) yes'
>>> re.findall(r1,s)
['python', '123', '2423', 'yyyyy1']
>>> r1 = r'hello src=.+ yes'
>>> re.findall(r1,s)
['hello src=python yes', 'hello src=yyyyy1 yes']
>>> r1 = r'hello src=(.+) yes'
>>> re.findall(r1,s)
['python', 'yyyyy1']
>>>