可参考 网络分析法 (2)-- >>正则表达式(1)极其详尽版
正则表达式对python的支持
-
在其他编程语言中,处理正则表达式时,反斜杠“”时常带来想不到的造成困扰
-
反斜杠既可作为普通字符,又兼任着转义字符的功能,假如你需要匹配文本中的字符“\”
-
那么使用编程语言表示的正则表达式需要使用4个反斜杠“\\”:前两个和后两个分别用于在编程语言中转义成反斜杠,转换成两个反斜杠后,再在正则表达式中转义成一一个反斜杠。
-
而在Python中,原生字符串很好地解决了这个问题,简单地使用r"“即可。同样,匹配一个数字的”\d"可以写成r"d"。使用原生字符串,无须担心繁杂的转义问题,写出来的表达式也更加直观。
-
-
Python中使用re模块来提供对正则表达式的支持。使用re的一般步骤是先将正则表达式的字符串形式编译为Pattem实例,然后使用Pattern实例处理文本并获得匹配结果(一个 Match实例最后使用Match实例获得信息,进行其他的操作。
-
普通字符 字⺟、数字、汉字、下划线、以及没有特殊定义的符号,都是"普通字符"。
-
正则表达式中的普通字符,在匹配的时候,只匹配与⾃身相同的⼀个字符。
-
例如:表达式c,在匹配字符串abcde时,匹配结果是:成功;匹配到的内容 是c;匹配到的位置开始于2,结束于3。(注:下标从0开始还是从1开始,因当前编程语⾔的不同⽽可能不同)
-
match()函数
match(pattern, string, flags=0)
从字符串string起始位置开始匹配pattern,若匹配到,则返回一个match对象,若未匹配到,则返回None
- 第⼀个参数是正则表达式,如果匹配成功,则返回⼀个match对象,否则返 回⼀个None
- 第⼆个参数表示要匹配的字符串
- 第三个参数是标致位⽤于控制正则表达式的匹配⽅式 如: 是否区分⼤⼩写,多 ⾏匹配等等
例如:
import re
patten = 'python'
string = 'python and me'
req = re.match(patten,string)
if req:
print(req)
else:
print('对不起,没有匹配到')
<re.Match object; span=(0, 6), match='python'>
import re
patten = 'python'
string = 'me and python'
req = re.match(patten,string)
if req:
print(req)
else:
print('对不起,没有匹配到')
对不起,没有匹配到
compile与falges
re.compile(patterm,flags-0)
compile可以将字符串pattern 转化为Pattern对象,用来给其他的re函数提供正则表达式参数,做进一步归搜索,其中的flags是匹配模式,可选的有:
-
re.I:忽咯大小写。
-
re.M:多行模式, 改变"和$的行为。
-
re.S:点任意匹配模式,改变“.” 的行为。
-
re.L;使预定字符类\wW\bB’s\S取决于当前区域设定。
-
re.U:使预定字符类\w\W b\BslS)d\D取决于Unicode 定义的字符属性。
-
re,V;详细模式,这个模式下正则表达式可以是多行的, 忽略空白字符,并可以加入注释
分组功能
Python的re模块有⼀个分组功能。所谓的分组就是去已经匹配到的内容再筛选 出需要的内容,相当于⼆次过滤。实现分组靠圆括号(),⽽获取分组的内容靠的 是group()、groups(),re模块⾥的积个重要⽅法在 分组上,有不同的表现形式,需要区别对待
import re
patten = 'python'
string1 = 'python and me'
string2 = 'me and python'
req1 = re.match(patten,string1)
req2 = re.match(patten,string2)
if req1:
# 返回匹配的所有结果
print('groups():',req1.groups())
# 匹配的内容
print('group():',req1.group())
# 返回未分组的原始匹配对象
print('group(0)',req1.group(0))
# group(1)返回第一组对象,依次类推
# print('group(1):',req1.group(1))
# 匹配的内容的开始位置
print('start():',req1.start())
# 匹配的内容的结束位置
print('end():',req1.end())
# 匹配的内容的位置
print('span()',req1.span())
else:
print('string1没有匹配到')
if req2:
# 返回匹配的所有结果
print('groups():',req2.groups())
# 匹配的内容
print('group():',req2.group())
# 返回未分组的原始匹配对象
print('group(0)',req2.group(0))
# group(1)返回第一组对象,依次类推
# print('group(1):',req2.group(1))
# 匹配的内容的开始位置
print('start():',req2.start())
# 匹配的内容的结束位置
print('end():',req2.end())
# 匹配的内容的位置
print('span()',req2.span())
else:
print('string2没有匹配到')
groups(): ()
group(): python
group(0) python
start(): 0
end(): 6
span() (0, 6)
string2没有匹配到
re.search
re.search(pattern,string,flags=0)
Search万法与match方法类似,不同的是,match 必须在字符串起始位置开始匹配,而search观会查找整个string进行匹配。若在任意位置匹配到,则返回一个 Match对象,示例如下。
re search全文查找字符串
import re
#将正则表达式转化成Pattern对象
pattern = re.compile(r' (\d{4})-(\d{8})')
#待匹配字符串
string1 = "0755-44445555 is our new office phone number"
string2 = "the old number 0755-11112222 is no longer used"
#生成search对象
search1 = re.match(pattern, string1)
search2 = re.search(pattern, string2)
if search1:
# re.search 结果类型
print('search1返回结果类型为:',type(search1))
# groups 返回所有匹配结果
print ('search1 groups: ', search1 .groups())
# group(0)为未分组的原始匹配对象
print ('searchl group(0):',search1.group(0))
#group(1)为第一组对象,以此类推
print('searchl group(l) :',search1.group(1))
print ('searchl group (2) :', search1.group(2))
else:
print('search1 没有匹配到对象 ')
if search2:
print('re.search2返回结果类型为:',type (search1))
print('groups: ', search2.groups())
print ('search2 group:', search2.group(0))
print(' search2 group(l):', search2.group(1))
print('search2 group (2) tjv9at/g:', search2.group(2))
else:
print ('search2 没有匹配到')
searchl返回结果类型为: <class ' sre.SRE Match'>
search1 q: groups tjuay: ('0755', 44445555')
search1 group(0) j41G7: 0755-44445555
search1 ф group(1)1197/: 0755
search1 q group(2) HJPyGy: 44445555
search2返回结果类型为: <class ' sre.SRE Match'>
re.search返回结果类型为: ('0755', 11112222')
search2 q groups fj1if73: 075511112222
search2 q group (0) fpi: 07551112222
search2 f group(2)J1434: 0755
search2 ф group(2) 1143: 11122222