re模块操作

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

使用步骤

  1. 使用 compile() 函数将正则表达式的字符串形式编译为一个 Pattern 对象
  2. 通过 Pattern 对象提供的一系列方法对文本进行匹配查找,获得匹配结果,一个 Match 对象。
  3. 最后使用 Match 对象提供的属性和方法获得信息,根据需要进行其他的操作

match()从起始位置开始查找,一次匹配

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
pattern = re.compile(r"http")
result = pattern.match("http://www.baidu.com")
if result:
    print("以http开头")
else:
    print("不是以http开头")

# 从字符串的第20个位置开始匹配
result = pattern.match("http://www.baidu.comhttp://www.qq.com", 20)
if result:
    print("以http开头")
else:
    print("不是以http开头")

print("匹配的内容是:", result.group(0))
print("匹配到起始位置是:", result.start(0))
print("匹配到终点位置是:", result.end(0))
print("匹配到数据的位置是:", result.span(0))
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
# 匹配 *** ***
# [a-z]表示任意一个字母
# + 表示至少一次,最多无限次
# ()表示一个group
pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I)  # re.I 表示忽略大小写
m = pattern.match('Hello World Wide Web')
print(m)     # 匹配成功,返回一个 Match 对象
print(m.group(0))  # 返回匹配成功的整个子串
print(m.span(0))   # 返回匹配成功的整个子串的索引
print(m.group(1))  # 返回第一个分组匹配成功的子串
print(m.span(1))   # 返回第一个分组匹配成功的子串的索引
print(m.group(2))  # 返回第二个分组匹配成功的子串
print(m.span(2))   # 返回第二个分组匹配成功的子串
print(m.groups())  # 等价于 (m.group(1), m.group(2), ...)
# print(m.group(3))   # 不存在第三个分组
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# IndexError: no such group

search()从任何位置开始查找,一次匹配

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
# \d表示匹配0-9的一个数字
pattern = re.compile(r'\d+')
m = pattern.search('one12twothree34four')  # 这里如果使用 match 方法则匹配不到数据
print(m)
print(m.group())
m = pattern.search('one12twothree34four', 10, 30)  # 指定字符串区间
print(m.group())
print(m.span())

sub()替换子串

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
# \w 等价于 [A-Za-z0-9],匹配任意字母和数字
p = re.compile(r'(\w+) (\w+)')
s = 'hello 123, hello 456'

print(p.sub(r'hello world', s))  # 使用 'hello world' 替换 'hello 123' 和 'hello 456'
print(p.sub(r'\2 \1', s))      # 引用分组


def func(m):
    return 'hi' + ' ' + m.group(2)


print(p.sub(func, s))
print(p.sub(func, s, 1))         # 最多替换一次
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
bad_words = [
    (r'毛\s*泽\s*东', '毛*东'),
    (r'江\s*泽\s*民', '江*民'),
    (r'胡\s*锦\s*涛', '胡*涛'),
]

content = "毛  泽  东带领江泽民指导胡锦涛学习Python"
for bad_word in bad_words:
    pattern = re.compile(bad_word[0])
    content = pattern.sub(bad_word[1], content)
print(content)

split()分割字符串

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
p = re.compile(r'[\s\,\;]+')
print(p.split('a,b;; c   d'))


p = re.compile(r'[\-万月/]+')
print(p.split('1.2-1.8万/月'))

finditer()全部匹配,返回迭代器

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import re
pattern = re.compile(r'\d+')

result_iter1 = pattern.finditer('hello 123456 789')
print(type(result_iter1))
for m1 in result_iter1:   # m1 是 Match 对象
    print('------matching string: {}, position: {}'.format(m1.group(), m1.span()))

result_iter2 = pattern.finditer('one1two2three3four4', 0, 10)
print(type(result_iter2))
for m2 in result_iter2:
    print('======matching string: {}, position: {}'.format(m2.group(), m2.span()))

findall()全部匹配,返回列表

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
pattern = re.compile(r'\d+')   # 查找数字
result1 = pattern.findall('hello 123456 789')
result2 = pattern.findall('one1two2three3four4', 0, 10)
print(result1)
print(result2)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
import requests

pattern = re.compile(r"""<img src="(.*?)".*?/>""")
content = requests.get("http://www.27270.com/zt/zrfg/").text
result = pattern.findall(content)
for src in result:
    print(src)


匹配邮箱

# -*- coding:utf-8 -*-
import re

pattern = re.compile(r'^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$')
result = pattern.match("[email protected]")
if result:
    print "是邮箱"
else:
    print "不是邮箱"

匹配手机

# -*- coding:utf-8 -*-
import re

pattern = re.compile(r'^(0|86|17951)?(13[0-9]|15[012356789]|18[0-9]|14[57])[0-9]{8}$')
result = pattern.match("13563746534")
if result:
    print "是手机号"
else:
    print "不是手机号"

匹配密码强度

# -*- coding:utf-8 -*-
import re


def checklen(pwd):
    return len(pwd)>=8


def checkContainUpper(pwd):
    pattern = re.compile('[A-Z]+')
    match = pattern.findall(pwd)
    if match:
        return True
    else:
        return False


def checkContainNum(pwd):
    pattern = re.compile('[0-9]+')
    match = pattern.findall(pwd)
    if match:
        return True
    else:
        return False


def checkContainLower(pwd):
    pattern = re.compile('[a-z]+')
    match = pattern.findall(pwd)
    if match:
        return True
    else:
       return False


def checkSymbol(pwd):
    pattern = re.compile('([^a-z0-9A-Z])+')
    match = pattern.findall(pwd)
    if match:
        return True
    else:
        return False


def checkPassword(pwd):
    # 判断密码长度是否合法
    lenOK=checklen(pwd)
    # 判断是否包含大写字母
    upperOK=checkContainUpper(pwd)
    # 判断是否包含小写字母
    lowerOK=checkContainLower(pwd)
    # 判断是否包含数字
    numOK=checkContainNum(pwd)
    # 判断是否包含符号
    symbolOK=checkSymbol(pwd)
    print(lenOK)
    print(upperOK)
    print(lowerOK)
    print(numOK)
    print(symbolOK)
    return (lenOK and upperOK and lowerOK and numOK and symbolOK)


def main():
    if checkPassword('Helloworld#123'):
        print('检测通过')
    else:
        print('检测未通过')

if __name__ == '__main__':
    main()

匹配中文

# -*- coding:utf-8 -*-
import re
title = u'你好,hello,世界 我是谁 啊'
pattern = re.compile(ur'[\u4e00-\u9fa5]+')

result = pattern.findall(title)

for word in result:
    print word

去除网页中除了src以外的所有标签属性

# -*- coding: utf-8 -*-
import re

with open("1.txt", "r") as f1:
    content = f1.read()
    pattern = re.compile(r"""\b(?!(?:href|src))\w+=(["\']).+?\1""", re.I)
    result = pattern.sub("", content)
    result = result.replace(" >", ">")
    with open("2.txt", "w") as f2:
        f2.write(result)

贪婪模式和非贪婪模式(笔试题常考)

  • 贪婪模式:在整个表达式匹配成功的前提下,尽可能多的匹配 ( * );
  • 非贪婪模式:在整个表达式匹配成功的前提下,尽可能少的匹配 ( ? );
  • Python里数量词默认是贪婪的。

results matching ""

    No results matching ""