Loading

Python正则表达式

正则表达式的作用

正则表达式是一些由字符和特殊符号组成的字符串,它们描述了这些字符和字符的某种重复方式,因此能按某种模式匹配一个有相似特征的字符串的集合。

正则表达式的主要作用是被用来进行文本的检索、替换或者提取我们想要的字符串。

Python通过标准库的re模块支持正则表达式。

常用的特殊字符

符号 描述
. 匹配除换行符以外的任意字符
^ 匹配字符串的开头
$ 匹配字符串的结束
[] 用于表示一个字符集合。比如 [abc] 匹配 ab, 或者 c。可以表示范围,用-相连,如 [a-z] 将匹配任何小写字母。还可以使用^取反,如[^abc]匹配除了a,b,c之外的字符
? 对于前面的字符重复0到1次
* 对于前面的字符重复0次到多次
+ 对于前面的字符重复1次或多次
*? 重复任意次,但尽可能少的重复
+? 重复1次或多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{m} 指定重复匹配 m 次,少于 m 的话就会导致匹配失败。比如,a{6} 将匹配6个 a , 但是不能是5个
{m,} 匹配至少m次
{m,n} 匹配至少m次至多n次,比如,a{3,5}将匹配 3 到 5 个 a
\w 匹配字母、数字和下划线,等价于[A-Za-z0-9_]
\W \w相反,匹配非字母、数字和下划线,等价于[^A-Za-z0-9_]
\d 匹配数字,等价于 [0-9]
\D 匹配非数字,等价于 [^0-9]
\s 匹配任意空白字符,包括空格、制表符、换页符等等。
\S 匹配任意非空白字符。
\b 匹配一个单词边界,也就是指单词和空格间的位置。
\B 匹配非单词边界。
` `

re模块

在 Python 中,re模块提供了正则表达式常用的处理函数。

re.match

从字符串开始匹配,用正则表达式匹配指定的字符串,如果以符合条件的字符串开头则返回匹配对象,否则返回None。

match(pattern, string, flags=0)
  • pattern:匹配的正则表达式
  • string:要匹配的字符串
  • flags:标识位,用来控制正则表达式的匹配方式,如:是否区分大小写、多行匹配等。
    • re.I:忽略大小写。
    • re.L:表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境。
    • re.M:多行模式。
    • re.S:使 . 匹配包括换行在内的所有字符。
    • re.U:表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库。
    • re.X:为了增加可读性,忽略空格和 # 后面的注释。

示例:

r1 = re.match("tom", "tomas")
print(r1)  # <re.Match object; span=(0, 3), match='tom'>
print(r1.group())  # tom
  • 使用group(num)groups() 匹配对象函数来获取匹配表达式。
匹配对象方法 描述
group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

re.search

搜索第一次匹配的字符串,如果有匹配,则返回一个匹配对象。

search(pattern, string, flags=0)

示例:

import re

r1 = re.search("hello|hi", 'hellowqrehi')
print(r1)  # b<re.Match object; span=(0, 5), match='hello'>
print(r1.group())  # hello

r2 = re.search("\d+(.*?)\d+", "1+2 3*4")
print(r2.group())  # 1+2
print(r2.groups())  # ('+',)

s = "www.baidu.com"
r3 = re.search("(www)\.(baidu|qq)\.(com)", s)
print(r3)  # <re.Match object; span=(0, 13), match='www.baidu.com'>
# 获取的是匹配到的数据
print(r3.group())  # www.baidu.com
# 获取的是分组里面的数据
print(r3.groups())  # ('www', 'baidu', 'com')

re.split

用指定的模式分隔符拆分字符串,返回列表。

split(pattern, string, maxsplit=0, flags=0)
  • pattern : 正则中的模式字符串。
  • string : 要被查找替换的原始字符串。
  • maxsplit : 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
  • flags:标志位,用于控制正则表达式的匹配方式。

示例:

import re

s = "tom;jerry 你好, a=b"
print(re.split("[;, =]", s))  # ['tom', 'jerry', '你好', '', 'a', 'b']

re.sub

用于替换字符串中的匹配项。

sub(pattern, repl, string, count=0, flags=0):
  • pattern:正则中的模式字符串。
  • repl:替换的字符串,也可为一个函数。
  • string:要被查找替换的原始字符串。
  • count:模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
  • flags:标志位,用于控制正则表达式的匹配方式。

示例:

import re

print(re.sub(r"tom", "jerry", "tom is boy"))  # jerry is boy
print(re.sub(r'\D', "", "188-1234-4321"))  # 18812344321

re.findall

返回与模式匹配的所有字符串组成的列表。

findall(pattern, string, flags=0)

示例:

import re

r1 = re.findall("\d+", "asd15f2rfsd634*^$%")
print(r1)  # ['15', '2', '634']

r2 = re.findall("\D", "ab#$c1%7^32hj好48&_78")
print(r2)  # ['a', 'b', '#', '$', 'c', '%', '^', 'h', 'j', '好', '&', '_']


r3 = re.findall("\w", "qw#$e^你好234_")
print(r3)  # ['q', 'w', 'e', '你', '好', '2', '3', '4', '_']

r4 = re.findall("[abc]", "dfghjklop")
# 当没有符合的匹配时,返回空列表
print(r4)  # []

r5 = re.findall("a?b", "abbeab abcb aab")
print(r5)  # ['ab', 'b', 'ab', 'ab', 'b', 'ab']

r6 = re.findall("a{1,3}b", "abcdaabaed")
print(r6)  # ['ab', 'aab']

r7 = re.findall("a.", "asdfabadf")
print(r7)  # ['as', 'ab', 'ad']

r8 = re.findall("a.?", "asdfabadf")
print(r8)  # ['as', 'ab', 'ad']

r9 = re.findall("a.+", "asdfabadf")
print(r9)  # ['asdfabadf']

r10 = re.findall("a.*", "asdfabadf")
print(r10)  # ['asdfabadf']

s = "188abcabdsa 199adfasdaf 13512344567 asdasdaf135 19955556666"
r11 = re.findall("(?:135|199)\d{8}", s)  # ['13512344567', '19955556666']
print(r11)  # ['13512344567', '19955556666']

s = "13512345432"
r12 = re.findall("^(?:135|199)[0-9]{8}$", s)
print(r12)  # ['13512345432']

re.finditer

findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

finditer(pattern, string, flags=0)

示例:

import re

it = re.finditer(r"\d{2}", "32ba3a25bcd43yt6")
for match in it:
    print(match.group())
    
# 输入内容如下
32
25
43

re.compile

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供其他函数使用。

compile(pattern, flags=0)

示例:

import re

pattern = re.compile(r"\d+")
print(pattern.match("123abc1234jyhuqcyhqj").group())  # 123
print(pattern.search("aa12ab125").group())  # 12
print(pattern.findall("326qq-yu234yhj79"))  # ['326', '234', '79']
print(pattern.split("as34f1dd55f"))  # ['as', 'f', 'dd', 'f']
posted @ 2021-07-05 09:56  charlatte  阅读(68)  评论(0编辑  收藏  举报