正则表达式

1.re模块的使用方式

# 导入re模块
import re

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

# 如果上一步匹配到数据的话,使用group方法提取数据,否则返回None
result.group()

import re

pattern = compile(r'匹配规则', re.I)
# re.I 忽略大小写
# re.S 表示全文匹配
pattern.match('需匹配的字符串')

2.表示字符

字符功能
.匹配任意字符,除了(\n)
[ ]匹配[ ]列举的字符
\d匹配数字,即0-9
\D匹配非数字
\s匹配空格,即空格,tab建
\S匹配非空格
\w匹配单词字符,即a-z,A-Z,0-9,_
\W匹配非单词字符

re.match(‘1\d\d’,’123’)
re.match(‘1[123]\d’, 123)
re.match(‘1[^123]\d’, ‘123’) # 在方括号里面写’^’,表示取反

3.表示数量

字符功能
*匹配前一个字符出现0次或者无限次
+匹配前一个字符出现1次或者无限次
?匹配前一个字符出现1次或者0次
{m}匹配前一个字符出现m次
{m,}匹配前一个字符至少出现m次
{m,n}匹配前一个字符出现从m次到n次

re.match(‘1[13578]/d{9}’,’13345678901’)

4.原始字符串

# 在字符串中如果出现'\',需要使用原始字符串进行匹配
re.match(r'\\nabc', '\\nabc')

5.表示边界

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

re.match(r’^1[35678]\d{9}$’,’18111111111’)
re.match(r’^\w+\s\bve\b’, ‘ho ve r’)
re.match(r’^.+ve\B’, ‘ho ver’)

6.匹配分组

字符功能
(?P<’name’>)分组起别名
(?P=name)引用分组名为name分组匹配到的字符串
字符功能
|匹配左右任意一个表达式
(ab)将括号中字符作为一个分组
\num引用分组num匹配到的字符串,如\2,\1
# 匹配1-100之间的数字
re.match(r'[1-9]\d?$|0$|100$', '85')
re.match(r'[1-9]?/d?$|100$', '85')

s = '<h1>匹配分组</h1>'
result = re.match(r'<h1>(.+)</h1>', s)
result.group()
result.group(1)
result.groups()
结果为:
'匹配分组'
'匹配分组'
('匹配分组',)

s = '<html><h1>匹配分组</h1></html>'
re.match(r'<(.+)><(.+)>.+</\2></\1>', s)

s = '<html><h1>匹配分组</h1></html>'
re.match(r'<(?P<key1>.+)><(?P<key2>.+)>.+</(?P=key2)></(?P=key1)>', s)

7.re的高级用法
re.match() # 从起始位置开始往后查找,返回第一个符合规则的,只匹配一次
re.search() # 从任何位置开始往后查找,返回第一个符合规则的,只匹配一次
re.findall() # 所有的全部匹配,返回列表
re.finditer() # 所有的全部匹配,返回的是一个迭代器
re.split() #分割字符串,返回列表
re.sub() # 替换
(1)search

    s = 'itcast<h1>itcast<h1>'
    re.search(r'\w+<h1>', s)
    结果为:
    <_sre.SRE_Match object; span=(0, 10), match='itcast<h1>'>

(2)findall

    s = 'itcast<h1>itcast<h1>'
    re.findall(r'\w+<h1>', s)
    结果为:
    ['itcast<h1>', 'itcast<h1>']

(3)sub

    re.sub(r'\d+', '998', 'python=997')
    结果为:
    python=998

    def replace(result):
        print(result.group)
        r = int(result.group) + 50
        return str(r)
    re.sub(r'\d+', replace, 'python=100, php=0')
    结果为:
    100
    0
    python=150, php=50

    s = '<h1>静夜思</h1><h2>窗前明月光</h2>'
    re.sub(r'</?\w+>', '', s)
    结果为:
    静夜思窗前明月光

(4)split

s = 'itcast,php,python-cpp'
re.split(r':|,|-|', s)
结果为:
['itcast', 'php', 'python', 'cpp']

8.贪婪模式和非贪婪模式
python里数量词默认是贪婪的,总是尝试匹配尽可能多的字符
非贪婪则相反,总是尝试匹配尽可能少的字符
在’*’, ‘?’, ‘+’,’{m, n}’后面加上’?’,使得贪婪模式变成非贪婪模式

# 贪婪模式下
s = 'This is a number 234-456-789'
r = re.match(r'(.+)(\d+-\d+-\d+)', s)
r.groups()
结果为:
# 检测到d+有一个数字就可以完成匹配
('This is a number 23', '4-456-789')

# 非贪婪模式下
s = 'This is a number 234-456-789'
r = re.match(r'(.+?)(\d+-\d+-\d+)', s)
r.groups()
结果为:
('This is a number ', '234-456-789')

9.练习
提取网站前面的一部分

s = 'http://www.baidu.com/image?id=35'
re.sub(r'(http://.+?/).*', lambda x:x.group(1), s)
结果为;
http://www.baidu.com/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值