路漫漫其修远兮
吾将上下而求索

python学习:正则

正则表达式
\d  可以匹配一个数字 
\w  可以匹配一个数字或者字母
.   可以匹配一个任意字符
\s  可以匹配到一个空格  \s+至少一个空格

*   表示任意长度的字符(包括0个)
+   表示任意长度的字符,至少一个
?   表示0个或者1个
{n} 表示n个字符
{n-m} 表示n到m个字符

\d{3}\s+\d{3,8}  表示3个数字,至少一个空格,后面3-8个数字

我们强烈建议使用Python的r前缀,就不用考虑转义的问题了
import re

a = re.match(r'^\d{3}\-\d{3,8}$','010-12345')
print (a)   #可以匹配到
b = re.match(r'^\d{3}\-\d{3,8}$', '010 12345')
print (b)   #匹配不到


Python split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串
将字符串按照正则表达式的内容为分隔符,分割成列表形式
a = 'a b   e'
b = re.split(r'\s+', a)
print (b)
['a', 'b', 'e']

c = re.split(r'[\s\,\;]+', 'a,b;; c  d')
print (c)
['a', 'b', 'c', 'd']


除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(Group)
group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串

正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符
a = re.match(r'^(\d+)(0*)$', '1023000').groups()
print (a)
('1023000', '')

必须让\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配
a = re.match(r'^(\d+?)(0*)$', '1023000').groups()
print (a)
('1023', '000')

如果一个正则表达式要重复使用几千次,出于效率的考虑,我们可以预编译该正则表达式,接下来重复使用时就不需要编译这个步骤了,直接匹配
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学习:正则

分享到:更多 ()

评论 抢沙发

评论前必须登录!