Life & Code

代码是咒语,我是魔法师

<Dive Into Python>节选.

例 7.14. 处理开始字符

				
...
>>> phonePattern = re.compile(r'^\D*(\d{3})\D*(\d{3})\D*(\d{4})\D*(\d*)$') 1 >>> phonePattern.search('(800)5551212 ext. 1234').groups() 2 ('800', '555', '1212', '1234')
>>> phonePattern.search('800-555-1212').groups() 3 ('800', '555', '1212', '')
>>> phonePattern.search('work 1-(800) 555.1212 #1234') 4
>>>
1 这个正则表达式和前面的几乎相同,除了在第一个记忆组(区号)前面匹配\D*,0或者多个非数字字符。注意,此处你没有记忆这些非数字字符(他们没有被括号括起来)。如果你发现他们,只是跳过他们,接着只要匹配上就开始记忆区号。
 2 你可以成功的解析电话号码,即使在区号前面有一个左括号。(在区号后面的右括号也已经被处理,它被看成非数字字符分隔符,由第一个记忆组后面的 \D*匹配。)
 3 进行仔细的检查,保证你没有破坏前面能够匹配的任何情况。由于首字符是完全可选的,这个模式匹配字符串的开始,接着是0个非数字字符,接着是一个有三个数字字符的记忆组(800),接着是1个非数字字符(连字符),接着是一个有三个数字字符的记忆组(555),接着是1个非数字字符(连字符),接着是一个有四个数字字符的记忆组(1212),接着是0个非数字字符,接着是一个有0个数字位的记忆组,最后是字符串的结尾。
 4 此处是正则表达式让我产生了找一个硬东西挖出自己的眼睛的冲动。为什么这个电话号码没有匹配上?因为在它的区号前面有一个 1,但是你认为在区号前面的所有字符都是非数字字符(\D*)。 Aargh.

posted on 2006-10-25 10:17 橙子 阅读(356) 评论(0)  编辑 收藏 引用 所属分类: C++ & STL


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2006年9月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(10)

随笔分类

随笔档案

相册

收藏夹

搜索

最新评论

阅读排行榜