正则表达式是一种匹配字符串的工具。python中通过导入re来实现。
规则:
| | |
Tables | 含义 |
---|---|
\d | 可以匹配一个数字 |
\w | 匹配一个字母或数字 |
. | 匹配任意字符 |
* | 任意个字符(包括0个) |
+ | 表示至少一个字符 |
? | 表示0个或1个字符 |
{n} | 表示n个字符 |
{n,} | 表示至少匹配n次 |
{n,m} | 表示n-m个字符 |
\s | 匹配一个空格(也包括Tab等空白符),\s+表示至少有一个空格 |
^ | 表示行的开头 |
$ | 表示行的结尾 |
还有一些用法,
“[ ]”:例如数字除了用\d表示之外,还能用[0-9], 字母也可以写成[a-zA-Z]表示其中的任意一个。
举例:
import re
>>> re.match(r'^\d{3}\-\d{3,8}$', '010-12345')
<_sre.SRE_Match object; span=(0, 9), match='010-12345'> #表示匹配成功
>>> re.match(r'^\d{3}\-\d{3,8}$', '010 12345') #没有输出表示匹配失败
>>>
有一种情况需要注意
>>> re.match(r'^\d+', '01a3')
<_sre.SRE_Match object; span=(0, 2), match='01'>
我们希望’^\d+’匹配任意个数字,但实际结果却能跟’01a3’匹配上了。match=’01’由此说明’^\d+’匹配的是任意以数字开头的字符,不能保证后续的也是数字。所以正确的方式如下:
>>> re.match(r'^\d+$', '01a345') #后面要加一个$,这样就能保证所有的字符串都是数字。
>>>
分组:正则表达式还有提取子串的功能。用()表示的就是要提取的分组
>>> 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) #group(0)始终表示原始配对的项
'010-12345'
>>> m.group(1) #第一个括号里的内容
'010'
>>> m.group(2) #第二个括号的内容
'12345'
最后举个实例,剑指offer中的一个题,判断一个字符串是否是数字。
题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。
“^[-+]?[0-9]*(.?[0-9]+)?([eE][-+]?[0-9]+)?$”
这个题可以用正则表达式来实现。分为如下几步:
1.正负号的判断:一个数可以存在正负号,也可以不存在。所以我们要用到”?”,同时正负号是只能有一个,是“或”的关系,所以用“[ ]”。最终这一部分的形式为:“^[\-\+]?”或者“^[-+]?”。”^”表示以这个为开头,-和+是有含义的,所以需要用”\”转置,我测试过,当这些符号在”[ ]”里面也是可以不用转义的。
2.整数部分判断:整数部分也可能是不存在的,eg “.98”就表示0.98.所以最终形式为:“[0-9]*”。因为” * “限定了[0-9]是可以为0个或任意多个。
3.小数部分判断:小数部分也是可能出现的。但是只要有小数点出现,那么后面必须会跟上数字,这个时候“( )”就派上用场了。“(\.[0-9]+)?”。这里的数字判断就要用上“+”,表示至少有一个数字,“?”限定的范围是整个“( )”。
4.指数部分判断:这一部分与上一部分类似, “([eE][-+]?[0-9]+)?$”,[eE]后面有可能存在“-+”,所以多了”[+-]?”这部分的判断。同时还有很重要的一点,就是一定要加上“$”,正则式的匹配是以只要能找到pattern的部分就返回值。
完整的表达式为:
pattern = “^[-+]?[0-9]*(\.[0-9]+)?([eE][-+]?[0-9]+)?$”
re.match(p, s)