Python: 正则表达式实例透析

re模块

import re

re.search

经常用match = re.search(pat, str)的形式。因为有可能匹配不到,所以re.search()后面一般用if statement

str = 'an example word:cat!!'
match = re.search(r'word:\w\w\w', str)
if match:
    print 'found', match.group() ## 'found word:cat'
else:
    print 'did not find'
found word:cat
# re.search return a match object, which contains lots of info
print type(match)
<type '_sre.SRE_Match'>
print match.string # source string
print match.group()
print match.start() # position of w
print match.end() # position of t
print match.endpos # position of last !
print match.span()
an example word:cat!!
word:cat
11
19
21
(11, 19)

re.match

re.matchre.search很相似,只是re.match是从字符串的开头开始匹配。

s = 'python tuts'
match = re.match(r'py',s)
if match:
    print(match.group())
py
s = 'python tuts'
match = re.search(r'^py',s)
if match:
    print(match.group())
py

常用正则字符意义

  • a, X, 9,等字符匹配自己, 元字符不匹配自己,因为有特殊意义,比如** . ^ $ * + ? { }[ ] \ | ( )**
  • . 英文句号,匹配任意字符,不包含'\n'
  • \w 匹配'word'字符,[a-zA-Z0-9]
  • \W 匹配非'word'字符
  • \b 匹配'word'和'non-word'之间边界
  • \s 匹配单个whitespace字符,space, newline, return, tab, form [\n\r\t\f]
  • \S 匹配non-whitespace字符
  • \t, \n, \r 匹配tab, newline, return
  • \d 匹配数字[0-9]
  • ^ 匹配字符串开头
  • $ 匹配字符串结尾

重复

‘+’ 一或多次, ‘*’ 零或多次, ‘?’ 零或一次

方括号[]

# 提取email address
string = 'purple alice-b@gmail.com monkey dishwasher'
match = re.search(r'\w+@\w+', string)
if match:
    print match.group()  ## 'b@google'
b@gmail

[]类似于or Square brackets can be used to indicate a set of chars, so [abc] matches 'a' or 'b' or 'c'.

match = re.search(r'[\w.-]+@[\w.-]+',string)
if match:
    print match.group()
alice-b@gmail.com

Group Extraction圆括号()

有时候需要提取匹配字符的一部分,比如刚才的邮箱,我们可能需要其中的usernamehostname,这时候可以用()分别把usernamehostname包起来,就像r'([\w.-]+)@([\w.-]+)',如果匹配成功,那么pattern不改变,只是可以用match.group(1)match.group(2)usernamehostnamematch.group()结果不变。

string = 'purple alice-b@google.com monkey dishwasher'
match = re.search(r'([\w\.-]+)@([\w\.-]+)',string)
if match:
    # Return subgroup(s) of the match by indices or names.
    print match.group() # or match.group(0)
    print match.group(1)
    print match.group(2)
if match:
    # Return a tuple containing all the subgroups of the match, from 1.
    print match.groups()
alice-b@google.com
alice-b
google.com
('alice-b', 'google.com')

findall and groups

()findall()结合,如果包括一或多个group,就返回a list of tuples

str = 'purple alice@google.com, blah monkey bob@abc.com blah dishwasher'
tuples = re.findall(r'([\w\.-]+)@([\w\.-]+)', str)
print tuples  # [('alice', 'google.com'), ('bob', 'abc.com')]
for tuple in tuples:
    print tuple[0] # username
    print tuple[1] # host
[('alice', 'google.com'), ('bob', 'abc.com')]
alice
google.com
bob
abc.com

re.search^之后是一样的。

re.sub

re.sub(pat, replacement, str)在str里寻找和pattern匹配的字符串,然后用replacement替换。replacement可以包含\1或者\2来代替相应的group,然后实现局部替换。

# replace hostname
str = 'alice@google.com, and bob@abc.com'
#returns new string with all replacements,
# \1 is group(1), \2 group(2) in the replacement
print re.sub(r'([\w\.-]+)@([\w\.-]+)', r'\1@yo-yo-dyne.com', str)
alice@yo-yo-dyne.com, and bob@yo-yo-dyne.com

参考

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏desperate633

LintCode 最小差题目代码

给定两个整数数组(第一个是数组 A,第二个是数组 B),在数组 A 中取 A[i],数组 B 中取 B[j],A[i] 和 B[j]两者的差越小越好(|A[i]...

992
来自专栏WD学习记录

牛客网 正则表达式匹配

请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是...

982
来自专栏Crossin的编程教室

【Python 第70课】lambda 表达式

Python 是一门简洁的语言,lambda 表达式则充分体现了 Python 这一特点。 lambda 表达可以被看做是一种匿名函数。它可以让你快速定义一个...

3026
来自专栏Android Note

Java 8之lambda表达式(一)

993
来自专栏超然的博客

ECMAScript 6 笔记(三)

  ES6 的写法还有两个好处:首先,阅读代码的人,可以立刻意识到哪些参数是可以省略的,不用查看函数体或文档;其次,有利于将来的代码优化,即使未来的版本在对外接...

792
来自专栏程序员互动联盟

【C语言系列】C语言数组

一、数组的概念 用来存储一组数据的构造数据类型 特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素。 二、数组的定义 格式...

3266
来自专栏猿人谷

C语言指针5分钟教程

指针、引用和取值 什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量。在这份教程里“引用”表示计算机内存地址。从指针指向的内 存...

2125
来自专栏黄Java的地盘

正则表达式之入门篇

本文主要通过对正则表达式的语法进行一些简单的介绍,从而让没有接触过或者想学习正则表达式的同学有一个基础的了解,从而能够看懂和编写使用一般的正则表达式。

1131
来自专栏大闲人柴毛毛

稳扎稳打JavaScript(二)——图解对象内存模型

1. 什么是JS对象? 在JS中,对象是一组无序属性的集合。其中,属性可以是基本数据类型、引用类型、函数。如下面这个对象的例子: var chai={ ...

4216
来自专栏测试开发架构之路

C++之类和对象的使用(二)

析构函数 析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一系列清理工作,使这部分内存可以被程序分配给新对象使用。对象生命周期结束,程序就自动执...

2777

扫码关注云+社区