正则表达式的作用,以及使用场景
1.用于从字符串中匹配满足某种规则的内容,多数用于爬虫应用程序
2.判断字符串串内容是否满足某种规则,多用于严重用户输入。例如密码是否规范,手机号是否正确等
1.re模块常用方法
-
re.compile(pattern,flags=0)
将正则表达式模式编译为正则表达式对象 -
re.search(pattern, string, flags=0)
扫描字符串以查找正则表达式模式产生匹配项的第一个位置 ,然后返回相应的match对象 -
re.match(pattern, string, flags=0)
如果字符串开头的零个或多个字符与正则表达式模式匹配,则返回相应的匹配对象 -
re.fullmatch(pattern, string, flags=0)
如果整个字符串与正则表达式模式匹配,则返回相应的match对象。 -
re.split(pattern, string, maxsplit=0, flags=0)
split能够按照所能匹配的字串将字符串进行切分,返回切分后的字符串列表
pattern:表达式
string:需要切分的字符串
maxsplit:分隔次数,默认为0(即不限次数)
flags:标志位,用于控制正则表达式的匹配方式,比如:是否区分大小写
>>> s = 'Beautiful, foam, No one. is wrong.'
>>> re.split('\W+',s)
['Beautiful', 'foam', 'No', 'one', 'is', 'wrong', '']
>>> re.split('(\W+)',s) #如果加上括号,结果会同时返回去掉的值
['Beautiful', ', ', 'foam', ', ', 'No', ' ', 'one', '. ', 'is', ' ', 'wrong', '.', '']
>>> re.split('\W+',s,1) #当前字符串只切分1次
['Beautiful', 'foam, No one. is wrong.']
>>> re.split('\d+',s) #没有可匹配的项,返回原来的字符串
['Beautiful, foam, No one. is wrong.']
- re.findall(pattern, string, flags=0)
search方法,模式匹配成功后,也会返回一个Match对象。
search方法和match的方法区别在于match只能从头开始匹配,而search可以从字符串的任意位置开始匹配。
他们的共同点是,如果匹配成功,返回一个Match对象,如果匹配失败,返回一个None。
这里还要注意,search仅仅查找第一次匹配,也就是说一个字符串中包含多个模式的匹配,也只会返回第一个匹配的结果。
如果要返回所有的结果,最简单的方法就是findall方法,也可以使用finditer方法
从左到右扫描该字符串,并以找到的顺序返回匹配项。如果该模式中存在一个或多个组,则返回一个组列表;否则,返回一个列表。如果模式包含多个组,则这将是一个元组列表。空匹配项包含在结果中。
>>> regex = re.compile('\d{3,5}')
>>> s = '1234 ab 12345 cd 123456.'
>>> regex.findall(s)
['1234', '12345', '12345']
>>> s = '''
foam:beautiful,Tiger:strong,
Cat:lovely ,dog:Loyal
'''
>>> re.findall('(\w+):(\w+)',s) #多个组返回元组列表
[('foam', 'beautiful'), ('Tiger', 'strong'), ('Cat', 'lovely'), ('dog', 'Loyal')]
>>> re.findall('\w+:(\w+)',s) 返回组列表
['beautiful', 'strong', 'lovely', 'Loyal']
- re.finditer(pattern, string, flags=0)
返回一个迭代器,该迭代器在string类型的RE 模式的所有非重叠匹配中产生匹配对象。 从左到右扫描该字符串,并以找到的顺序返回匹配项。空匹配项包含在结果中。
>>> for i in re.finditer('(\w+):(\w+)',s):
print('{0}-->{1}'.format(i.group(1),i.group(2)))
foam-->beautiful
Tiger-->strong
Cat-->lovely
dog-->Loyal
#其实和findall结果类似,只是返回的是迭代对象
>>> for i in re.finditer('\w+:(\w+)',s):
print('{0}-->{1}'.format(i.group(1),i.group(0)))
beautiful-->foam:beautiful
strong-->Tiger:strong
lovely-->Cat:lovely
Loyal-->dog:Loyal
- re.sub(pattern, repl, string, count=0, flags=0)
Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
>>> s = '0571-64581092'
>>> regex = '^\d{4}'
>>>> print(re.sub(regex,"0579",s))
0579-64581092
2. 正则表达式修饰符 - 可选标志
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
3. re模块之分组group
- 除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(Group)
如果正则表达式中定义了组,就可以在Match对象上用group()方法提取出子串来。
注意到group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串。
s = '0571-64581092'
>>> regex = re.search('(\d+)-(\d*)',s)
>>> regex.group(0)
'0571-64581092'
>>> regex.group(1)
'0571'
>>> regex.group(2)
'64581092'
>>> regex.groups()
('0571', '64581092')