【Python】正则表达式

笔记性质、非教程

 

CHAPTER-1 尝试 

CHAPTER-2 从零开始学正则

 

CHAPTER-3 THE RIME OF THE ANCYENT MARINERE, IN SEVEN PARTS.

 

参考:

1、入门 --> here

2、菜鸟教程 --> here

3、常用正则表达式 --> here

 

正文:

CHAPTER-1 尝试

1、匹配qq号。(5到10位任意数字)

import re
numbers = ['1234', '123456', '12345678901']
for x in numbers:
    print(re.match(r'^\d{5,10}$', x))

2、匹配用户名(由字母和数字组成,必须由字母开头,4到10位)注:\w会匹配数字。

import re
strs = ['abc', '1abcd', '1997abc', 'a199', 'abc1997']
for x in strs:
    print(re.match(r'^[a-zA-z][0-9a-zA-z]{3,9}$', x))

3、匹配邮箱

import re
strs = ['@qq.com', '33@', '22@ee.', '5566@qq.net', '3dsd_xx@vip.ccc.com']
for x in strs:
    print(re.match(r'^\w{1,20}@(|vip.)[a-z0-9]{1,12}(.com|.net)$', x))

4、匹配类似这样的日期2017-05-04

import re
strs = ['19-2-1', '1997-10', '1999-2-2', '1777-19-19', '1889-12-31']
for x in strs:
    print(re.match(r'^\d{4}-\d{2}-\d{2}$', x))

 

CHAPTER-2 从零开始学正则

参考:《Introducing Regular Expressions》

1、匹配北美电话号码。

import re
strs = ['770-827-7019']
for x in strs:
    print(re.match(r'770-827-7019', x)) # 用string literal匹配目标字符串
    print(re.match(r'7', x))
    print('\n')
output:
<_sre.SRE_Match object; span=(0, 12), match='770-827-7019'>
<_sre.SRE_Match object; span=(0, 1), match='7'>

 

2、形如[0-9]被视为character class(字符组)character set(字符集),用更具体的数字可以得到同样的结果,如[0123456789]。

[]被称为metacharacter(元字符),特征是:不参与匹配。

import re
strs = ['770-827-7019', ]
for x in strs:
    print(re.match(r'[0-9]', x)) 
    print(re.match(r'[0123789]', x))
    print(re.match(r'[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]', x))
    print('\n')

# output:
# <_sre.SRE_Match object; span=(0, 1), match='7'>
# <_sre.SRE_Match object; span=(0, 1), match='7'>
# <_sre.SRE_Match object; span=(0, 12), match='770-827-7019'>

 

3、在2中的[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]显然显得过于冗长,为了消除这种“冗长”,引入了character shorthand(字符简写式)例如可以用\d来完全替代[0-9],用\D来匹配所有非数字。

import re
strs = ['770-827-7019', ]
for x in strs:
    print(re.match(r'[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]', x)) # 原始形式
    print(re.match(r'\d\d\d-\d\d\d-\d\d\d\d', x)) # 简写形式
    print(re.match(r'\d\d\d\D\d\d\d\D\d\d\d\d', x))
    print('\n')

# output:
# <_sre.SRE_Match object; span=(0, 12), match='770-827-7019'>
# <_sre.SRE_Match object; span=(0, 12), match='770-827-7019'>
# <_sre.SRE_Match object; span=(0, 12), match='770-827-7019'>

 

4、用.匹配所有字符。

import re
strs = ['770-827-7019', '770%827%7019', '770|827|7019']
for x in strs:
    print(re.match(r'\d\d\d.\d\d\d.\d\d\d\d', x))

# output:
# <_sre.SRE_Match object; span=(0, 12), match='770-827-7019'>
# <_sre.SRE_Match object; span=(0, 12), match='770%827%7019'>
# <_sre.SRE_Match object; span=(0, 12), match='770|827|7019'>

 

5、capturing group(捕获分组)和backreference。例如(\d)\d\1,(\d)匹配第一个数字并将其“捕获”,\d匹配第二个数字而不“捕获”,\1用前面“捕获”的具体的数字“再次”进行匹配。例如下面的\1等价于数字“7”:

strs = ['.707', '.708']
for x in strs:
    print(re.match(r'\D(\d)\d\1', x))

# output:
# <_sre.SRE_Match object; span=(0, 4), match='.707'>
# None

 

6、quantifier(量词),让正则表达式更加简洁:{3,4} (3或4)、?(0或1)、+(1或多)、* (0或多)

重写匹配北美电话号码的正则(效果上等价于\d\d\d[.-]?\d\d\d[.-]?\d\d\d\d,但是形式上更为简洁):

strs = ['707-827-7019', '707-827-701']
for x in strs:
    print(re.match(r'(\d{3}[.-]?){2}\d{4}', x))

# output:
# <_sre.SRE_Match object; span=(0, 12), match='707-827-7019'>
# None

 

7、正则表达式在线测试:http://tool.chinaz.com/regex

 

刚开始不理解书上|后面的^,然后测试发现无论正则前面加多少个^都是不影响的(仍是匹配行首)。

源正则:^(\(\d{3}\)|^\d{3}[.-]?)?\d{3}[.-]?\d{4}$ (手动高亮),匹配北美电话,括号、区号都是可选的

 

8、在notepad++中使用正则表达式

 

9、为什么有那么多编写正则表达式的方法?

 

posted @ 2017-05-03 18:13  xkfx  阅读(230)  评论(0编辑  收藏  举报