字符 作用
[m1m2……mn] 表示一个字符集合(m1、m2……mn等均为单个字符),表示可以与集合中的任意一个字符匹配
[^m1m2……mn] 表示可以与集合之外的任意一个字符匹配
[m-n] 表示一个字符范围集合,表示可以与字符m到n之间的所有字符匹配
[^m-n] 表示可以与集合范围之外的任意一个字符匹配
\d 用来匹配一个数字字符,相当于“[0-9]”
\D 用来匹配一个非数字字符,相当于“[^0-9]”
\w 用来匹配一个单词字符(包括数字、大小写字母和下画线),相当于“[A-Za-z0-9_]”
\W 用来匹配任意一个非单词字符,相当于“[^A-Za-z0-9_]”
\s 用来匹配一个不可见字符(包括空格、制表符、换行符等)
\S 用来匹配一个可见字符
. 用来匹配除了换行符外的任意一个字符
【例】
>>> import re
>>> str='''<span class="td td-2nd"><a href="/air/nanchang.html" target="_blank">南昌市</a></span><span class="td td-4rd">17</span><span class="td td-4rd"><em class="f1" style="color:#79b800">优</em></span>'''
则:
>>> re.findall(r"\d\d",str)
['17', '79', '80'] #匹配出str中只含2个数字的字符串
>>> re.findall(r"[6789]\d",str)
#匹配出str中只含2个数字的字符串,且第一个数字符号可以是6或7或8或9
['79', '80']
>>> re.findall(r"td.",str)
#匹配出 str中以td开头,第三个字符不是换行符的连续三个字符
['td ', 'td-', 'td ', 'td-', 'td ', 'td-']
>>>s = 'aaa,bbb ccc high' #定义字符串
>>> re.findall(r'[a-zA-Z]+',s)
['aaa', 'bbb', 'ccc', 'high'] #实现了分词效果
正则表达式元字符介绍:
字符 作用
* 用来匹配前面的字符任意多次(0到多次)
+ 用来匹配前面的字符一次或多次
? 用来匹配前面的字符零次或一次
{n} 用来匹配前面的字符n次,n是一个非负整数
{n,} 用来匹配前面的字符至少n次,n是一个非负整数
{n,m} 用来匹配前面的字符串至少n次,至多m次,m和n为非负整数且n≤m
*?,+?,
??,{}? ?跟在前面所述的任何一个数量限定符后面时,表示匹配模式是非贪婪的,
即尽可能少地匹配字符串。而默认情况下,匹配是贪婪的,即尽可能多地匹配所搜索的字符串。
【例】
>>> import re
>>> str='''<span class="td td-2nd"><a href="/air/nanchang.html" target="_blank">南昌市</a></span><span class="td td-4rd">17</span><span class="td td-4rd"><em class="f1" style="color:#79b800">优</em></span>'''
则:
# re.findall(r"\d{2,}",str)等价于re.findall(r"\d\d",str), re.findall(r"\d\d\d…",str)
>>> re.findall(r"\d{2,}",str)
['17', '79', '800'] #匹配出str中至少含2个数字的字符串
>>> re.findall(r"\d{1,}b\d{1,}",str)
['79b800'] #匹配出str中数字串中包含一个字母b的字符串
>>> s="fdfd<a>aaaaa</a>dfefe<b>bbbb</b>"
>>>regex = '<.*?>.*?<\/.*?>'
>>> re.findall(regex,s)
['<a>aaaaa</a>', '<b>bbbb</b>'] #从字符串中分离出标签对
4、字符定位元字符
字符 作用
^ 用来匹配输入字符串是否以。。。。开始。
$ 用来匹配输入字符串是否以。。。。结束。
\b 用来匹配一个单词边界(即单词和空格之间的位置)。事实上,所谓单词边界不是一个字符,而只是一个位置。
\B 用来匹配一个非单词边界。
【例】
>>> import re
>>> str='''<span class="td td-2nd"><a href="/air/nanchang.html" target="_blank">南昌市</a></span><span class="td td-4rd">17</span><span class="td td-4rd"><em class="f1" style="color:#79b800">优</em></span>'''
则:
>>> re.findall(r"td",str)
['td', 'td', 'td', 'td', 'td', 'td']
>>> re.findall(r"^td",str) #判断str是以td开头,进行匹配
[]
字符 作用
\ 元字符在符号在正则表达式中与特殊的含义,
如果想要匹配元字符,可以采用转义的方式。如:\\ ,\*, \.等
如果把元字符放在[]中,就不需要采用转义方式
【例】
>>> import re
>>> str='''<span class="td td-2nd"><a href="/air/nanchang.html" target="_blank">南昌市</a></span><span class="td td-4rd">17</span><span class="td td-4rd"><em class="f1" style="color:#79b800">优</em></span>'''
则:
>>> re.findall(r"\".*?\"",str)
#匹配出str中所有" "之间的字符串
['"td td-2nd"', '"/air/nanchang.html"', '"_blank"', '"td td-4rd"', '"td td-4rd"', '"f1"', '"color:#79b800"']
>>> re.findall(r'["].*?["]',str)
['"td td-2nd"', '"/air/nanchang.html"', '"_blank"', '"td td-4rd"', '"td td-4rd"', '"f1"', '"color:#79b800"']
#通过结果可以看出,如果把元字符放在[]中,就不需要采用转义方式。
正则表达式的常用函数介绍
re.compile(pattern, flags=0) 匹配任何可选的标记来编译正则表达式的模式,然后返回一个正则表达式对象
re.search(pattern,string, flags=0) 使用可选标记搜索字符串中第一次匹配正则表达式的对象。如果匹配成功,则返回匹配对象,否则返回None
re.match(pattern, string, flags=0)
使用带有可选标记的正则表达式的模式来匹配字符串,匹配是从字符串的第一个字符开始进行。如果匹配成功,返回匹配对象,否则返回None
re.findall(pattern, string, flags=0)
查找字符串中所有匹配的子字符串,并返回一个字符串匹配列表
匹配对象.group(num = 0) 返回整个匹配对象,或者编号为num的特定子组
例如:下面的正则表达式定义从s中匹配出ip地址的内容。
>>> import re
>>> s="ipddress192.168.10.1else"
>>>m1=re.search(r"(([01]{0,1}\d{0,1}\d|25[0-5])\.){3}([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])",s)
>>> print(m1.group())
#输出
192.168.10.1
>>> str='''<span class="td td-2nd"><a href="/air/nanchang.html" target="_blank">南昌市</a></span><span class="td td-4rd">17</span><span class="td td-4rd"><em class="f1" style="color:#79b800">优</em></span><span class="td td-2nd"><a href="/air/nanchang.html" target="_blank">武汉市</a></span><span class="td td-4rd">17</span><span class="td td-4rd"><em class="f1" style="color:#79b800">优</em></span>'''
>>> re.findall(r"\"_blank\">(.{1,}?)</a>",str)
#匹配出所有的城市名
['南昌市', '武汉市']