正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串使用含有某种子串、将匹配的子串替换或者是从某个串中取出某个条件的子串等。
正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
正则表达式模式
- 数字和字母表示他们自身。
- 多数字母和数字前加一个反斜杠时会拥有不同的含义。
- 标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
- 反斜杠本身需要使用反斜杠转义。
模式(re指表达式) | 描述 |
---|---|
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾 |
. | 匹配任意字符,除了换行符,当当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。 |
[…] | 用来表示一组字符,单独列出:[amk]匹配’a’,’m’或’k’ |
[^…] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符 |
re* | 匹配0个或多个的表达式 |
re+ | 匹配1个或多个的表达式 |
re? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
re{n} | 匹配n个前面表达式。例如,”o{2}”不能匹配”Bob”中的”o”,但是能匹配”food”中的两个o |
re{n,} | 精确匹配n个前面表达式。例如,”o{2,}”不能匹配”Bob”中的”o”,但能匹配”foooood”中的所有o。”o{1,}”等价于”o+”。”o{0,}”则等价于”o*”。 |
re{n,m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
a | b |
(re) | 匹配括号内的表达式,也表示一个组 |
特殊字符类
实例 | 描述 |
---|---|
. | 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式。 |
\d | 匹配一个数字字符。等价于[0-9] |
\D | 匹配一个非数字字符。等价于[^0-9] |
\s | 匹配任何空白字符,包括空白、制表符、换页符等等。等价于 [\f\n\r\t\v]。 |
\S | 匹配任何非空白字符。等价于 [^\f\n\r\t\v]。 |
\w | 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]’。 |
\W | 匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]’。 |
正则常用函数
- re.match(pattern, string, flags=0):尝试从字符串的起始位置匹配一个模式,匹配成功re.match方法返回一个匹配的对象,否则返回None。我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
print(re.match("www", "www.runoob.com"))
# <_sre.SRE_Match object; span=(0, 3), match='www'>
print(re.match("www", "www.runoob.com").group())
# www
print(re.match("www", "www.runoob.com").span())
# (0, 3)
print(re.match("com", "www.runoob.com"))
# None
line = "Cats are smarter than dogs"
#.* 表示任意匹配除换行符(\n \r)之外的任何单个或多个字符
# (.*?)表示“非贪婪”模式,只保存第一个匹配到的子串
matchObj = re.match(r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
print("matchObj.group(): ", matchObj.group())
print("matchObj.group(1): ", matchObj.group(1))
print("matchObj.group(2): ", matchObj.group(2))
else:
print("No match!")
# matchObj.group(): Cats are smarter than dogs
# matchObj.group(1): Cats
# matchObj.group(2): smarter
复制代码
- re.search(pattern, string, flags=0):扫描整个字符串并返回第一个成功的匹配,否则返回None。
print(re.search('www', 'www.runoob.com').span())
# (0, 3)
print(re.search('com', 'www.runoob.com').span())
# (11, 14)
复制代码
re.match与re.search的区别
re.match 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None,而 re.search 匹配整个字符串,直到找到一个匹配。
- re.sub(pattern, repl, string, count=0, flags=0),3个参数是必选的:
- pattern(必选) : 正则中的模式字符串。
- repl(必选) : 替换的字符串,也可为一个函数。
- string(必选) : 要被查找替换的原始字符串。
- count(可选) : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
- flags(可选): 编译时用的匹配模式,数字形式。
phone = "2004-959-559 # this is a phone number"
num = re.sub(r'#.*$', "", phone)
print("phone number : ", num)
# phone number : 2004-959-559
num = re.sub(r'\D', "", phone)
print("phone number : ", num)
# print("phone number : ", num)
复制代码
- re.compile(pattern[, flags]):用于编译正则表达式,生成一个正则表达式(Pattern)对象,供match()和search()这两个函数使用。
pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I) # re.I 表示忽略大小写
m = pattern.match('Hello World Wide Web')
print(m)
# <_sre.SRE_Match object; span=(0, 11), match='Hello World'> 匹配成功返回一个Match对象
print(m.group())
# Hello World 返回匹配成功的整个子串
print(m.group(1))
# Hello 返回第一个分组匹配成功的子串
print(m.span(1))
# (0, 5) 返回第一个分组匹配成功的子串的索引
print(m.group(2))
# World 返回第二个分组匹配成功的子串
print(m.span(2))
# (6, 11) 返回第二个分组匹配成功的子串索引
print(m.groups())
# ('Hello', 'World') 等价于 (m.group(1), m.group(2), ...)
复制代码
- re.findall(pattern, string, flags=0)或pattern.findall(string[, pos[, endpos]]):在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,泽返回空列表。注意: match 和 search 是匹配一次 findall 匹配所有。
results1 = re.findall(r'\d+', 'runoob 123 google 456')
pattern = re.compile(r'\d+')
results2 = pattern.findall('runoob 123 google 456')
# pattern.findall(string[, pos[, endpos]])
# pos 可选参数,指定字符串的起始位置,默认为0。
# endpos 可选参数,指定字符串的结束位置,默认为字符串的长度。
results3 = pattern.findall('run88oob123google456', 0, 10)
# ['88', '12']
复制代码
- re.finditer(pattern, string, flags=0):和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
it = re.finditer(r"\d+", "12a32bc43jf3")
for match in it:
print(match.group())
# 12
# 32
# 43
# 3
复制代码
- re.split(pattern, string[, maxsplit=0, flags=0]):split 方法按照能够匹配的子串将字符串分割后返回列表。maxsplit表示分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
print(re.split('\W+', 'runoob, runoob, runoob.'))
# \W+:匹配一个或多个非字母进行切割,匹配到的非字母不缓存。['runoob', 'runoob', 'runoob', '']
print(re.split('(\W+)', ' runoob, runoob, runoob.'))
#(\W+)匹配一个或多个非字母进行切割,匹配到的非字母全部缓存缓存。 ['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', '']
print(re.split('\W+', ' runoob, runoob, runoob.', 1))
['', 'runoob, runoob, runoob.']
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END