概述
1.正则表达式功能非常强大,但是学习难度也很大。正则表达式是一套独立的语法,和Python并没有任何相似和相关之处,只不过是Python提供了对正则表达式的支持。
2.正则表达式是编写网络爬虫提取特定内容的重要技术之一。
语法
- 正则表达式由元字符及其不同组合来构成,通过巧妙地构造正则表达式可以匹配任意字符串,并完成查找、替换、分隔等复杂的字符串处理任务。
- 元字符是指构成正则表达式的基本单位,是具有独立含义的字符或字符组合。
-
元字符 功能说明 \r 匹配一个回车字符 \b 匹配单词头或者尾 \B 与\b含义相反 \d 匹配任何数字[0-9] \D 与上表相反 \s 匹配任何空白字符[\f\n\r\v] \S 与上表相反 \w 匹配任何字母数字下划线[a-z A-Z 0-9] \W 与上表相反 () 将位于()内的内容作为一个整体来对待 {m,n} {}前面的字符或者子模式重复至少m次 之多n次 逗号前后不要有空格 [^a-z] 匹配除小写英文字母之外的任何字符 扩展语法
- 正则表达式使用圆括号“()”表示一个子模式,圆括号内的内容作为一个整体对待,例如'(red)+'可以匹配'redred'、'redredred'等一个或多个重复'red'的情况
-
语法 功能说明 (?P<groupname) 为子模式命名 (?iLmsux) 设置匹配标志,可以是几个字母的组合,每个字母含义编译标志相同 (?……) 匹配但不捕获该匹配的子表达式 (?P=groupname) 表示在之前的命名为groupname的子模式 (?#……) 表示注释 (?<=……) 用于正则表达式之前 表示如果<=后的内容在字符串中出现则匹配,但不返回<=之后的内容 (?=……) 用于正则表达式之后,………… (?<!……) 用于正则表达式之前,………… (?!…………) 用于正则表达式之后,………… (pattern)*:允许模式重复0或者多次
-
(pattern+:允许重复一或者多次
-
(pattern){m,n} 允许重复m-n次
-
1.正则表达式以^开头并以$结束,表示对整个字符串进行检查和匹配。
-
(a | b)*c
:匹配多个(包含0个)a或b,后面紧跟一个字母。ab{1,}
:等价于'ab+',匹配以字母a开头后面带1个至多个字母b的字符串。^[a-zA-Z]{1}([a-zA-Z0-9._]){4,19}$
:匹配长度为5-20的字符串,必须以字母开头并且可带字母、数字、下画线、圆点的字符串。^(\w){6,20}$
:匹配长度为6-20的字符串,可以包含字母、数字、下划线。^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$
:检查给定字符串是否为合法IP地址。^(13[4-9]\d{8}) | (15[01289]\d{8})$
:检查给定字符串是否为移动手机号码。^[a-zA-Z]+$
:检查给定字符串是否只包含英文字母大小写。^\w+@(\w+\.)+\w+$
:检查给定字符串是否为合法电子邮件地址。r'(\w)(?!.*\1)
:查找字符串中每个字符的最后一次出现。(\w)(?=.*\1)
:查找字符串中所有重复出现的字符。 -
^(\-)?\d+(\.\d{1,2})?$
:检查给定字符串是否为最多带有2位小数的正数或负数。[\u4e00-\u9fa5]
:匹配给定字符串中所有汉字。^\d{18}|\d{15}$
:检查给定字符串是否为合法身份证格式。\d{4}-\d{1,2}-\d{1,2}
:匹配指定格式的日期,例如2016-1-31。^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[,._]).{8,}$
:检查给定字符串是否为强密码,必须同时包含英语字母大写字母、英文小写字母、数字或特殊符号(如英文逗号、英文句号、下划线),并且长度必须至少8位。(?!.*[\'\"\/;=%?]).+
:如果给定字符串中包含'、"、/、;、=、%、?则匹配失败。(.)\\1+
:匹配任意字符的两次或多次重复出现。((?P<f>\b\w+\b)\s+(?P=f))
:匹配连续出现两次的单词。((?P<f>.)(?P=f)(?P<g>.)(?P=g))
:匹配AABB形式的成语或字母组合。 -
直接使用正则表达式模块re处理字符串
- re.l (支持本地字符集的字符)
- re.M(多行匹配模式)
- re.S(使元字符“.”匹配任意字符,包括换行符)
- re.U(匹配Unicode字符)
-
>>> import re #导入re模块 >>> text = 'alpha. beta....gamma delta' #测试用的字符串 >>> re.split('[\. ]+', text) #使用圆点或空格作为分隔符进行分隔 ['alpha', 'beta', 'gamma','delta'] >>> re.split('[\. ]+', text, maxsplit=2) #设置最多分隔2次 ['alpha', 'beta', 'gamma delta'] >>> re.split('[\. ]+', text, maxsplit=1) #最多分隔1次 ['alpha', 'beta....gamma delta'] >>> pat = '[a-zA-Z]+' >>> re.findall(pat, text) #查找所有单词 ['alpha', 'beta', 'gamma','delta']
>>> re.findall('\\b\w.+?\\b', example) #所有单词 ['Beautiful', 'is', 'better', 'than', 'ugly'] >>> re.findall('\w+', example) #所有单词 ['Beautiful', 'is', 'better', 'than', 'ugly'] >>> re.findall(r'\b\w.+?\b', example) #使用原始字符串 ['Beautiful', 'is', 'better', 'than', 'ugly'] >>> re.split('\s', example) #使用任何空白字符分隔字符串 ['Beautiful', 'is', 'better', 'than', 'ugly.'] >>> re.findall('\d+.\d+.\d+', 'Python 2.7.13') #查找并返回x.x.x形式的数字 ['2.7.13'] >>> re.findall('\d+.\d+.\d+', 'Python 2.7.13,Python 3.6.0') ['2.7.13', '3.6.0'] >>> s = '<html><head>This is head.</head><body>This is body.</body></html>' >>> pattern = r'<html><head>(.+)</head><body>(.+)</body></html>' >>> result = re.search(pattern, s) >>> result.group(1) #第一个子模式 'This is head.' >>> result.group(2) #第二个子模式 'This is body.'
match对象
- group()返回匹配的一个或多个子模块内容
- start()返回匹配的一个或多个子模块内容
- end()返回指定子模块内容的结束位置的前一个位置
-
>>> import re >>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist") >>> m.group(0) #返回整个模式内容 'Isaac Newton' >>> m.group(1) #返回第1个子模式内容 'Isaac' >>> m.group(2) #返回第2个子模式内容. 'Newton' >>> m.group(1, 2) #返回指定的多个子模式内容 ('Isaac', 'Newton')
>>> import re >>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds") >>> m.group('first_name') #使用命名的子模式 'Malcolm' >>> m.group('last_name') 'Reynolds' >>> m = re.match(r"(\d+).(\d+)", "24.1632") >>> m.groups() #返回所有匹配的子模式(不包括第0个) ('24', '1632') >>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds") >>> m.groupdict() #以字典形式返回匹配的结果 {'first_name': 'Malcolm', 'last_name': 'Reynolds'}
>>> s = 'aabc abcd abbcd abccd abcdd' >>> re.findall(r'(\b\w*(?P<f>\w+)(?P=f)\w*\b)', s) #连续重复出现的字母组合 [('aabc', 'a'), ('abbcd', 'b'), ('abccd', 'c'), ('abcdd', 'd')] >>> s = 'aabc abcd ababcd abccd abcdd' >>> re.findall(r'(\b\w*(?P<f>\w+)(?P=f)\w*\b)', s) #连续重复出现的字母组合 [('aabc', 'a'), ('ababcd', 'ab'), ('abccd', 'c'), ('abcdd', 'd')]
import re text = '''Suppose my Phone No. is 0535-1234567, yours is 010-12345678, his is 025-87654321.''' #注意,下面的正则表达式中大括号内逗号后面不能有空格 matchResult = re.findall(r'(\d{3,4})-(\d{7,8})', text) for item in matchResult: print(item[0], item[1], sep='-')
查找文本中最长的数字字符串
import re
def longest1(s):
'''查找所有连续数字'''
t = re.findall('\d+', s)
if t:
return max(t, key=len)
return 'No'
text = 'a1b22ccc333d22e1'
print(longest1(text))
将一句英语文本中的单词进行倒置
import re
def reverse(s):
t = re.split('\s+', s.strip())
t.reverse()
return ' '.join(t)
print(reverse('I like beijing.'))
print(reverse('Simple is better than complex.'))