学了廖雪峰大大的Python 3教程有一段时间了,感觉Python的语法基本掌握了,但是有一个部分却总是学了又忘,那就是我今天要讲的部分——正则表达式。正则表达式并不是Python独有的语法,而是计算机科学领域里一种常见的工具,在很多编程语言里都有应用(比如说Java和JS),在编译原理领域也有重要的用途,掌握好正则表达式会给处理文本带来很多方便。以下内容是我根据廖雪峰大大的教程里关于正则表达式相关知识做的总结,由于教程里是把Python正则表达式的语法规则和Python的re模块混合在一起讲的,初学者在学习时很有可能会弄混。所以我的文章将这两部分分开,前一部分讲Python中的正则表达式语法规则,后一部分讲怎样运用Python中的re模块。
Python中正则表达式的语法规则:
\d 匹配一个数字, \w 匹配一个字母或数字(能否匹配汉字视操作系统和应用环境而定), \s 匹配一个空白符, . 匹配任意一个字符, \b 匹配单词的开始或结束, ^ 匹配字符串的开始, $ 匹配字符串的结束;如何匹配变长的字符: 用 * 表示任意个字符(包括0个), 用 + 表示表示至少一个字符, 用 ?表示0或1个字符, 用{n}表示n 个字符, 用{n,m}表示n~m个字符;实现更精确的匹配:可以用[]表示范围。 例如[0-9a-zA-Z]可以匹配一个数字或字母,等价于 \w ; a|b 可以匹配 a 或 b ; py 可以匹配 "python" ; 用 () 来表示分组。 例如, ^(\d{3})-(\d{3,8})$ 可以匹配 “010-12345” ,其中 “010-12345” 是 group(0) , “010”是group(1) , “12345”是group(2) ; 贪婪匹配:正则匹配默认是贪婪匹配,会尽可能多的匹配字符串。 例如, ^\d+0*$“ 可以匹配 "102300”,由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。如果想让 \d+ 采用非贪婪匹配(也就是尽可能少匹配),加个 ? 就可以让 \d+ 采用非贪婪匹配了,将原正则表达式改为 ^\d+?0*$, \d+? 匹配到的就是“1023”, 0* 匹配到的就是“00”了。
Python的re模块用法:
match() 方法用于判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None 用法如下: import re test_string = "用户输入的字符串" if re.match(r"正则表达式",test_string): print ("ok") else: print("failed") split()方法比字符串的 split() 方法更加灵活 例如,请看正常的切分代码: >>> 'a b c'.split(' ') ['a', 'b', '', '', 'c'] 嗯,无法识别连续的空格。 用正则表达式试试: >>> re.split(r'\s+', 'a b c') ['a', 'b', 'c'] 无论多少个空格都可以正常分割。 如果正则表达式中定义了组,就可以在 Match 对象上用 group() 方法提取出子串来。 注意到 group(0) 永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串。 例如, >>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345') >>> m <_sre.SRE_Match object; span=(0, 9), match='010-12345'> >>> m.group(0) '010-12345' >>> m.group(1) '010' >>> m.group(2) '12345' 也可以用 groups() 方法显示所有分组 >>>m.groups() ( '010' , '12345' ) 如果一个正则表达式要多次使用,每次都要编写一遍就会很麻烦,可以使用compile()方法进行预编译再使用。 例如, >>> import re # 编译: >>> re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$') # 使用: >>>re_telephone.match('010-12345').groups() ('010', '12345') >>>re_telephone.match('010-8086').groups() ('010', '8086') 以上我讲了Python中的正则表达式语法规则和re模块的使用,由于正则表达式非常强大因此知识点也非常多,想在短短的一篇文章中讲全是不可能的,但是以上所讲的内容对于日常的编程问题应该是够用了。如果你想深入研究正则表达式,请购买相关书籍继续深造。