re模块
正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
很多语言中都有正则表达式的内容,当然python也不例外,python提供了re模块,来使用正则表达式。
首先说一下re里面的方法:
-
re.match(pattern, string, flags=0)
- match从开始处进行匹配,成功返回re.Match对象,否则返回None。 re.search(pattern, string, flags=0)
- search函数只返回第一个匹配到的结果,成功返回re.Match对象,否则返回None。 re.findall(pattern, string, flags=0)
- 按照规则匹配整个字符串,返回匹配结果的列表 re.sub(pattern, repl, string, count=0, flags=0)
- sub按照给定的规则将string字符串中的相应的片段替换为repl,count 最多替换的次数,count=0默认为全部替换,返回替换后的字符串 re.split(pattern, string, maxsplit=0, flags=0)
- 通过给定规则,将string进行切割,maxsplit最多切割次数,maxsplit=0默认全部切割,返回
pattern是将要匹配的规则,string是被匹配的字符串
re里面的元字符:
字符 | 功能 |
---|---|
^ | 字符串开始位置与匹配规则符合就匹配,否则不匹配匹配字符串开头。在多行模式中匹配每一行的开头 |
$ | 匹配最后一行行尾 |
[a-z] | 匹配a-z的字符,^元字符如果写到字符集里就是反取 |
? | 匹配前边的子表达式0次或1次,等价于{0,1} |
+ | 匹配前边的子表达式1次或多次,等价于{1,} |
* | 匹配前边的子表达式0次或多次,,等价于{0,} |
| | 匹配多个条件,多个条件连接是用| 隔开,相当于or |
. | 除"\r""\n"外,匹配任意的单个字符,要使"."匹配换行符 |
{} | {n}匹配n次,{n,}匹配至少n次,{m,n}匹配m-n次 |
\ | 转义字符,\\匹配\ |
re里面的预定义字符:
字符 | 功能 |
---|---|
\b | 匹配一个单词边界,也就是指单词和空格间的位置,其它特殊字符也可以是单词的边界,如"#","$","&","*"等 |
\B | 匹配非单词边界 |
\d | 匹配一个数字字符。等价于[0-9] |
\D | 匹配一个非数字字符。等价于[^0-9 |
\s | 匹配任何不可见字符,包括空格、制表符、换页符等,等价于[ \f\n\r\t\v] |
\S | 匹配任何可见字符。等价于[^ \f\n\r\t\v] |
\w | 匹配包括下划线的任何单词字符。这里的"单词"字符使用Unicode字符集,类似但不等价于“[A-Za-z0-9_]”,还包含汉字等它国字符 |
\W | 匹配任何非单词字符。这里的"单词"字符使用Unicode字符集,类似但不等价于“[^A-Za-z0-9_]”,还包含汉字等它国字符 |
re里面的模式:
字符 | 功能 |
---|---|
re.S(DOTALL) | 使.匹配包括换行在内的所有字符 |
re.I(IGNORECASE) | 使匹配对大小写不敏感 |
re.L(LOCALE) | 做本地化识别(locale-aware)匹配,法语等 |
re.M(MULTILINE) | 多行匹配,影响^和$ |
re.X(VERBOSE) | 该标志通过给予更灵活的格式以便将正则表达式写得更易于理解 |
re.U | 根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B |
分组:
1.\number 引用number组内容
2.(?P< name>pattern) 使用名: (?P=name)
贪婪与非贪婪:
+* ? {m,n} greedy 贪婪 尽可能多的进行匹配
*? +? ?? {m,n}? non-greedy 非贪婪
'''
分组操作 () 表示的是一组 | 或者关系
分组命名匹配
() + \number : \number 表示引用组匹配的内容
'''
import re
# Jack Tom Lucy Linda Steven Daniel。。。 JOY
s = 'hi linda'
m_obj = re.search('(hi|hello) (Jack|Tom|Lucy|Linda)', s, re.I) #
print(m_obj)
print(m_obj.group())
print(m_obj.group(1))
print(m_obj.group(2))
# 邮箱:126,163,qq 而且必须符合邮箱的格式 xxx@163.com xxx的长度4-16位之间
# email = input('请输入邮箱:')
# m_obj = re.search(r'^(\w{4,16})@(126|163|qq).com$', email)
# if m_obj:
# email_name = m_obj.group(1)
# print(email_name + '符合邮箱格式')
# else:
# print('不符合格式!')
# 1开头,不是以4、7结尾的手机号码(11位) 或者 010-34567897|0311-37647326
# tel = input('请输入号码:')
# m_obj = re.fullmatch(r'(1\d{9}[0-35689]|\d{3,4}-\d{8})', tel)
# print(m_obj)
# 标签:<a class="logo" target="_blank" href="/">
'''
<div class="breadcrumb">
<a target="_blank" class="album-name" href="/pic/%E5%8B%92%E5%B8%83%E6%9C%97%C2%B7%E8%A9%B9%E5%A7%86%E6%96%AF/1989503">勒布朗·詹姆斯图册</a> > <span class="album-desc">词条图片</span>
</div>
'''
s = '<div class="breadcrumb">詹姆斯</div>'
m = re.fullmatch(r'<(.+) class="breadcrumb">(.+)</\1>', s) #
print(m)
print(m.group(2))
s = "<p class='breadcrumb'><a href='http://www.baidu.com'>詹姆斯 </a></p>"
m = re.fullmatch(r"<(.+) class='breadcrumb'><(.+) href='http://www.baidu.com'>.+</\2></\1>", s)
print(m.group())
print(m.group(1))
print(m.group(2))
# 命名的方式(?P<outer>) (?P<inner>)
# http://image.baidu.com/star/page
m = re.fullmatch(
r"<(?P<outer>.+) class='breadcrumb'><(?P<inner>.+) href='http://www.baidu.com'>.+</(?P=inner)></(?P=outer)>", s)
print(m.group())
print(m.group(1))
print(m.group(2))
# 贪婪与非贪婪:
s = 'abbbbbbbbbc'
m = re.match('ab+?', s)
print(m.group())
s = '<div>hello</div><div>world</div>'
m = re.match(r'<(?P<n>.+)>.+?</(?P=n)>', s)
print(m.group())