大家好,对Python 正则表达式基础示例感兴趣的小伙伴,下面一起跟随三零脚本的小编来看看Python 正则表达式基础示例的例子吧。
正则表达式是搜索、替换和解析复杂字符串的一种强大而标准的方法,Python中的正则相关的东西全在re模块下。
#-------------------------------------------------------------------------------
# coding: utf-8
# Purpose:正则表达式
#
# Author: zdk
#
# Created: 26/02/2013
# Copyright: (c) zdk 2013
#-------------------------------------------------------------------------------
import re
if __name__== '__main__':
addr= "100 BROAD ROAD APT.3"
print(re.sub("ROAD","RD",addr))# 100 BRD RD APT.3
print(re.sub(r"\bROAD\b","RD",addr))# 100 BROAD RD APT.3
pattern= ".*B.*(ROAD)?"
print(re.search(pattern,"ROAD"))#None
print(re.search(pattern,"B"))#<_sre.SRE_Match object at 0x0230F020><span style="background-color:#FAFAFA;font-family:Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace;font-size:1em;line-height:1.5;"> </span>
(1)re.sub("ROAD","RD",addr) 利用re.sub函数对字符串addr进行搜索,满足表达式"ROAD"的用“RD”替换
(2)re.sub(r"\bROAD\b","RD",addr) ,“\b”含义是“单词的边界”,在Python中,由于字符“\”在字符串中必须转义,这会变得非常麻烦,所以Python用前缀r表示字符串中的所有字符都不转义。
(3)re.search(pattern,"ROAD") re模块有一个search函数,该函数有两个参数,一个是正则表达式,一个是字符串,search函数返回一个拥有多种方法可以描述这个匹配的对象,如果没有发现匹配,则返回None。
上面均是“紧凑”类型的表达式,它比较难以阅读,即使现在清楚表达式的含义,也不能保证几个月后还能记得。所以Python允许用户利用所谓的松散正则表达式来完成内联文档的需要,和一般的表达式有以下两个方面的主要区别
忽略空白符。空格符、制表符、回车符不匹配它们自身(如果你想在松散正则表达式中匹配一个空格符,你不须在它前面添加一个反斜杠符号对它进行转义)
忽略注释。和普通的Python代码一样,注释开始于#符号,结束于行尾。
#松散带有内联注释的正则表达式
pattern= """
^ # begin of string
M{0,3} # 0 to 3 M
(CM|CD|D?C{0,3}) #CM or CD or D or D 0 to 3 C
$ #end of string
"""
print(re.search(pattern,"MCM",re.VERBOSE))#<_sre.SRE_Match object at 0x021BAF60>
print(re.search(pattern,"M99",re.VERBOSE))#None
(1)当使用松散正则表达式时,最重要的一件事就是:必须传递一个额外的参数re.VERBOSE,它是re模块的一个常量,标志着待匹配的正则表达式是一个松散正则表达式。pattern的空格和注释都是被忽略的,但同时具有更好的可读性。
必须匹配如下电话号码:
格式比较多,我们需要知道的是800为区号,干线号为555,电话号的其他数字为1212,对于有分机号的,我们需要知道分机号为1234
#三零脚本 www.q3060.com
phonePattern= re.compile(r'''
# don't match beginging of string
(\d{3}) # 3 digits
\D* #any number of non-digits
(\d{3}) # 3 digits
\D* #any number of non-digits
(\d{4}) # 4 digits
\D* #any number of non-digits
(\d*) #any number of digits
''',re.VERBOSE)
print(phonePattern.search('work 1-(800)555.1212 #1234').groups()) #('800','555','1212','1234')
print(phonePattern.search('work 1-(800)555.1212 #1234').groups()) #('800', '555', '1212', '1234')
(1)一个松散正则表达式如上, 首先匹配3个数字区号(不一定从第一个字符开始,所以没有用^),接着后面匹配任意多个非数字的字符,接着匹配3个数字干线号,接着匹配任意多个非数字的字符,接着匹配4个数字号码,接着匹配任意多个非数字的字符,接着匹配任意多个数字的分机号,然后用groups函数分组,得到正确的电话号码。