作为一门现代语言,正则表达式是必不可缺的,在Python中,正则表达式位于re模块。
1 import re
这里不说正则表达式怎样去匹配,例如\d代表数字,^代表开头(也代表非,例如^a-z则不匹配任何小写字符),$代表结尾,这些百科或者其他书籍都有。
例子一,字符串中是否包含数字:
1 import re2 userinput = input("please input test string:")3 if re.match(r'\d',userinput):4 print('contain number')5 else:6 print('no number in input string')
假如输入的不包含数字的话,则re.match方法返回None,而含数字的话,则会返回一个Match对象。
例子二,分割字符串:
1 import re2 userinput = input("please input test string:")3 temp = re.split(r'\s+',userinput)4 print(temp)
\s代表任意空白字符(指空格、Tab等等的空白字符),+号表示1个或多个。那么这段代码的作用就是按照空白分割字符。例如字符串"a b dc"得到的将会是['a','b','dc']的列表。普通的字符串split函数要做到此功能则很难做到。
例子三,分组:
有时候,我们需要提取字符串中的一些部分,例如电话号码,由三位或四位的区号和八位的电话号码组成。
1 import re2 userinput = input("please input test string:")3 m = re.match(r'(\d{3,4})-(\d{8})',userinput)4 if m:5 print('区号:' + m.group(1))6 print('号码:' + m.group(2))7 else:8 print('格式错误')
分组使用(),这是正则表达式的基本。m.group从0开始计数,而0为输入的字符串。
例子四,贪婪匹配:
1 import re2 userinput = input("please input test string:")3 m = re.match(r'^(\d+)(0*)$',userinput)4 if m:5 print(m.groups())6 else:7 print('格式错误')
输入102500,我们得到的是('102500','')。
而我们想要的结果是('1025','00')。这里就需要使用非贪婪匹配了。因为Python里正则表达式是默认使用贪婪模式的(C#中也是)。
修改代码如下:
1 import re2 userinput = input("please input test string:")3 m = re.match(r'^(\d+?)(0*)$',userinput)4 if m:5 print(m.groups())6 else:7 print('格式错误')
即在\d+后加上一个?号。这样结果就会如我们所想的一样。
注意的是,非贪婪模式比贪婪模式效率要差,因此非到贪婪模式匹配不了就不要使用非贪婪模式。
例子五,正则表达式预编译:
使用re.compile方法。在多处需要使用到同一个正则表达式的时候,我们应该预编译该正则表达式,然后直接使用该方法返回的对象。