python正则案例

在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个模块,名字为re

1. re模块的使用过程

    #coding=utf-8

    # 导入re模块
    import re

    # 使用match方法进行匹配操作
    result = re.match(正则表达式,要匹配的字符串)

    # 如果上一步匹配到数据的话,可以使用group方法来提取数据
    result.group()

re.match是用来进行正则匹配检查的方法,若字符串匹配正则表达式,则match方法返回匹配对象(Match Object),否则返回None(注意不是空字符串"")。
匹配对象Macth Object具有group方法,用来返回字符串的匹配部分。

2. re模块示例(匹配以cellboxer开头的语句)

    #coding=utf-8

    import re

    result = re.match("cellboxer","cellboxer.com")

    result.group()

运行结果为:cellboxer

3.表示字符

字符 功能
. 匹配任意1个字符(除了\n)
[ ] 匹配[ ]中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即 空格,tab键
\S 匹配非空白
\w 匹配单词字符,即a-z、A-Z、0-9、_
\W 匹配非单词字符
示例1: . 匹配任意1个字符(除了\n)
ret = re.match('.','a')
ret.group()
'a'
ret = re.match('.','ab')
ret.group()
'a'
示例2:\d 匹配数字,即0-9
ret = re.match('\d','110')
ret.group()
'1'
示例3:\D 匹配非数字,即不是数字
ret =  re.match('\D','@')
ret.group()
'@'
示例4:\s 匹配空白,即 空格,\t,\r ,\n
import re
ret = re.match('\s',' ')
ret.group()
' '
ret = re.match('\s','\t')
ret.group()
'\t'
ret = re.match('\s','\r')
ret.group()
'\r'
ret = re.match('\s','\n')
ret.group()
'\n'
示例5: \S 匹配非空白
ret = re.match('\S','a')
ret.group()
'a'

示例6: \w 匹配单词字符,即a-z、A-Z、0-9、_
ret = re.match('\w','Abcd')
ret.group()
'A'
示例7:匹配[ ]中列举的字符
ret = re.match('1[345678]','13')
ret.group()
'13'
ret = re.match('1[^345678]','19')
ret.group()
'19'
ret = re.match('1[a-z5-9]','1b')
ret.group()
'1b'

4 表示数量

匹配多个字符的相关格式

字符 功能
* 匹配前一个字符出现0次或者无限次,即可有可无
+ 匹配前一个字符出现1次或者无限次,即至少有1次
? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m} 匹配前一个字符出现m次
{m,} 匹配前一个字符至少出现m次
{m,n} 匹配前一个字符出现从m到n次
示例1:*

需求:匹配出,一个字符串第一个字母为大小字符,后面都是小写字母并且这些小写字母可有可无

#coding=utf-8
import re

ret = re.match("[A-Z][a-z]*","Mm")
ret.group()

ret = re.match("[A-Z][a-z]*","Aabcdef")
ret.group()
image
示例2:+
#coding=utf-8
import re

ret = re.match("[a-zA-Z_]+[\w_]*","name1")
ret.group()
'name1'

ret = re.match("[a-zA-Z_]+[\w_]*","_name")
ret.group()
'_name'

示例3:?

需求:匹配出,0到99之间的数字

#coding=utf-8
import re

ret = re.match("[1-9]?[0-9]","7")
ret.group()
示例4:{m}

需求:匹配出,8到20位的密码,可以是大小写英文字母、数字、下划线

ret = re.match("[a-zA-Z0-9_]{8,20}","1ad12f23s34455ff66")
ret.group()

5.表示边界

字符 功能
^ 匹配字符串开头
$ 匹配字符串结尾
\b 匹配一个单词的边界
\B 匹配非单词边界
示例1:$

需求:匹配手机号码

ret = re.match('1[3,4,5,7,8]\d{9}$','13500000000')
ret.group()
'13500000000'

6.匹配分组

字符 功能
1 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组
\num 引用分组num匹配到的字符串
(?P<name>) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串
示例1:|

需求:匹配出0-100之间的数字

import re

while True:
    num = input('请输入\n')

    ret = re.match(r'[1-9]\d?$|0$|100$', num)

    try:
        result = ret.group()
        print('match result:',result)
    except AttributeError:
        print('not match!')
示例2:( )

需求:匹配出163、126、qq邮箱之间的数字

while True:
    text = str(input('请输入\n'))

    ret = re.match(r'\w{4,20}@(163|126|qq)\.com', text)

    try:
        result = ret.group()
        print('match result:',result)
    except AttributeError:
        print('not match!')

示例3:\number

需求:

匹配出 <html><h1>xiangzige</h1></html>
ret = re.match(r'<(\w*)><(\w*)>.*</\2></\1>','<html><h1>xiangzige</h1></html>')
try:
    result = ret.group()
    print('match result:',result)
except AttributeError:
    print('not match!')

示例4:(?P<name>) (?P=name)

需求:匹配出<html><h1>xiangzige</h1></html>
rule1 = r'<(\w*)><(\w*)>.*</\2></\1>'

rule2 = r'<(?P<key1>\w*)><(?P<key2>\w*)>.*</(?P=key2)></(?P=key1)>'

ret = re.match(rule2,'<html><h1>xiangzige</h1></html>')

try:
    result = ret.group()
    print('match result:',result)
except AttributeError:
    print('not match!')

re模块的高级用法

search

需求:匹配出文章阅读的次数

#coding=utf-8
import re

ret = re.search(r"\d+", "阅读次数为 9999")
ret.group()
findall

需求:统计出python、c、c++相应文章阅读的次数

#coding=utf-8
import re

ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
print ret
sub 将匹配到的数据进行替换

需求:将所有语言改为python

import re

result = re.sub(r'\w+(\s+|\b)','python ','java ios php js')

print(result)
split 根据匹配进行切割字符串,并返回一个列表

需求:切割字符串“info:xiaoZhang 33 shandong”

#coding=utf-8
import re
ret = re.split(r":| ","info:xiaoZhang 33 shandong")
print ret
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358

推荐阅读更多精彩内容

  • re模块手册 本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以...
    喜欢吃栗子阅读 4,010评论 0 13
  • 1.正则表达式概述 正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regula...
    TENG书阅读 846评论 0 1
  • 正则表达式到底是什么东西?字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等...
    狮子挽歌阅读 2,149评论 0 9
  • 正则表达式 1. 正则表达式概述 正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语...
    PythonMaO阅读 1,273评论 0 1
  • (今天编码时遇到深拷贝与浅拷贝的问题,网上找到这篇文章,转载下 by:yangchen) 阅读本文之前首先了解co...
    唐艺和风榻榻米丨大连店阅读 1,361评论 1 51