python re正则表达式

python re正则表达式

语法

语法 说明 表达式实例 完整匹配的字符串
字符
. 匹配任意除换行符”\n”外的字符 a.c abc
\ 转义字符,使后一个字符改变原理的意思。如果字符串中有字符*需要匹配,可以使用\* 或者字符集[*] a\.c
a\\c
a.c
a\c
[…] 字符集(字符类)对应的位置可以是字符集中任意字符,字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。第一个字符如果是^则表示取反,如[^abc]表示不是abc的其他字符。
所有的特殊字符在字符集都失去原有的特殊含义在字符集中如果要使用]、-或^、可以在前面加上反斜杠,或把]、-放在第一个字符把^放在非第一个字符
a[bcd]e abe
ace
ade
预定义字符集(可以写在字符集[…]中)
\d 数字:[0-9] a\dc a1c
\D 非数字:[^\d] a\Dc abc
\s 空白字符:[<空格>\t\r\n\f\v] a\sc a c
\S 非空白字符:[^\s] a\SC abc
\w 单词字符:[A-Za-z0-9_] a\wc abc
\W 非单词字符:[^\w] a\Wc a c
数量词(用在字符或(…)之后)
* 匹配前一个字符0次或无限次 abc* ab
abccc
+ 匹配前一个字符1次或无限次 abc+ abc
abccc
? 匹配前一个字符0次或者1次 abc? ab
abc
{m} 匹配前一个字符m次 ab{2}c abbc
{m,n} m和n可以省略: 若省略m则匹配0至n次,若省略n,则匹配m至无限次 ab{1,2}c abc
abbc
*? +? ?? {m,n}? 使* + ? {m,n}变成非贪婪模式 后面解释
边界匹配(不消耗待匹配字符串中的字符)
^ 匹配字符串开头,在多行模式中匹配每一行的开头 ^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
def
(…) 被括起来的表达式将作为分组,从表达式左边开始每遇到一个分组的左括号'(‘,编号+1.例外分组表达式作为一个整体,可以后接数量词表达式中的|仅对该组中有效 (abc){2}
a(123|456)c
abcabc
a456c
(?P<name>...) 分组,除了原来的编号外再指定一个额外的别名 (?P<id>abc){2} abcabc
\<number> 引用编号为<number>的分组匹配到的字符串 (\d)abc\1 1abc1
5abc5
(?P=name) 应用别名为<name>的分组匹配到的字符串 (?P<id>\d)abc(?P=id) 1abc1
5abc5

re.match

re.match 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None

re.match的函数原型为:re.match(pattern, string, flags)

  • 第一个参数是正则表达式,如果匹配成功,则返回一个Match,否则返回一个None;
  • 第二个参数表示要匹配的字符串;
  • 第三个参数是标致位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

re.search

search(pattern, string, flags=0)

  • 第一个参数:规则
  • 第二个参数:表示要匹配的字符串
  • 第三个参数:标致位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

re.match与re.search的区别:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

>>> import re
>>> print re.match(r'baidu','baidu.com')          
<_sre.SRE_Match object at 0x7f1fd7cc22a0>
>>> print re.match(r'baidu','www.baidu.com')
None
match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败
>>> print re.search(r'baidu','www.baidu.com')
<_sre.SRE_Match object at 0x7f1fd7cc22a0>
>>> print re.search(r'baidu','baidu.com')    
<_sre.SRE_Match object at 0x7f1fd7cc22a0>
>>> print re.search(r'baidu','google.com') 
None
re.search匹配整个字符串,直到找到一个匹配

使用场景: 验证某些字符串是否符合要求,eg 验证ip,mac,密码,邮箱格式,日期格式等

匹配IP地址
def IsIpAddr(varObj):

    pattern = r"\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
    if re.match(pattern, varObj):
        return False
    else:
        return True

判断帐号是否合法 字母开头,允许10-16字节,允许字母数字下划线
def IsLegalAccounts(varObj):

    rule = '[a-zA-Z][a-zA-Z0-9_]{9,15}$'
    match = re.match(rule, varObj)
    if match:
        return False
    return True

re.sub

sub(pattern, repl, string, count=0)

  • 第一个参数:规则
  • 第二个参数:替换后的字符串
  • 第三个参数:字符串
  • 第四个参数:替换个数。默认为0,表示每个匹配项都替换
import re

text = "JGood is a handsome boy, he is cool, clever, and so on..."
print re.sub(r'/s+', '-', text)

字符串中的空格 ' ' 替换成 '-' 

>>> re.sub('[-.]','','sa-sa.sa.as')
'sasasaas'
>>> 
将'-'和'.'替换成''

re.sub的函数原型为:re.sub(pattern, repl, string, count) 第四个参数指替换个数。默认为0,表示每个匹配项都替换。

re.split

split(pattern, string, maxsplit=0)

  • 第一个参数:规则
  • 第二个参数:字符串
  • 第三个参数:最大分割字符串,默认为0,表示每个匹配项都分割
>>> import re
>>> test_str = "1    2 3 4  5"
>>> re.split(r'\s+',test_str)
['1', '2', '3', '4', '5']
>>> re.split(r'\s+',test_str,2) #分割前2个
['1', '2', '3 4  5']

>>> test_str = "1  .  2. 3 .4 . 5"
>>> re.split(r'\.',test_str)
['1  ', '  2', ' 3 ', '4 ', ' 5']
>>> re.split(r'\.',test_str,3)
['1  ', '  2', ' 3 ', '4 . 5']

re.findall

findall(pattern, string, flags=0)

  • 第一个参数:规则
  • 第二个参数:目标字符串
  • 但三个参数:后面还可以跟一个规则选择项 返回的结果是一个列表,建中存放的是符合规则的字符串,如果没有符合规则的字符串呗找到,就会返回一个空值
>>> import re
>>> test_mail = '<test01@gmail.com> <test02@gmail.org> test03@gmail.net'
>>> mail_re = re.compile(r'\w+@g....\.[a-z]{3}')
>>> re.findall(mail_re,test_mail)
['test01@gmail.com', 'test02@gmail.org', 'test03@gmail.net']

re.compile

把正则表达式编译成一个正则表达式对象。可以把那些经常使用的正则表达式编译成正则表达式对象,这样可以提高一定的效率。实例见refindall

原文:http://blog.scoke.org/python%E6%A8%A1%E5%9D%97%E5%AD%A6%E4%B9%A0—-re%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注