Python学习笔记之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 匹配a或b
(re) 匹配括号内的表达式,也表示一个组
\w 匹配数字字母下划线
\W 匹配非字母数字及下划线
\s 匹配任意空白字符,等价于 [\t\n\r\f].
\S 匹配任意非空字符
\d 匹配任意数字,等价于 [0-9].
\D 匹配任意非数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
\z 匹配字符串结束
\G 匹配最后匹配完成的位置。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\n, \t, 等. 匹配一个换行符。匹配一个制表符。等
\1...\9 匹配第n个分组的内容。
\10 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。

正则表达式修饰符 - 可选标志

修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

例如:

      一个匹配网易邮箱账号的规则:6~18个字符,可使用字母、数字、下划线、需要一字母开头,并且以163.com结尾

     pattern = r'[a-zA-Z]{1}\w{5,17}@163\.com'   

re.match

re.match()尝试从字符串的起始位置开始匹配一个规则模式,如果不是起始位置匹配成功的话,就返回None

re.match(pattern,string,flags = 0)
   pattern : 匹配的正则表达式
   string  : 要匹配的字符串
   flags   : 正则表达式修饰符 - 可选标志,用于控制正则表达式的匹配方式,如 : 区分大小写,多行匹配等等
import re
line = "How are you ? I am fine ,and you ? "
print(len(line))
matchObj = re.match(r'(.*) are (\w+) .?', line)
if matchObj:
    print('matchobj:',matchObj)
    print("matchObj.span() : ", matchObj.span())
    print("matchObj.groups() : ", matchObj.groups())
    print("matchObj.group() : ", matchObj.group())
    print("matchObj.group(1) : ", matchObj.group(1))
    print ("matchObj.group(2) : ", matchObj.group(2))
else:
    print("No match!!")

首先,这是一个字符串,前面的一个 r 表示字符串为非转义的原始字符串,让编译器忽略反斜杠,也就是忽略转义字符。但是这个字符串里没有反斜杠,所以这个 r 可有可无。
 (.*) 第一个匹配分组,.* 代表匹配除换行符之外的所有字符。
 (\w+)) 第二个匹配分组,\w+ 匹配最少一个字母、数组、或下划线的
后面的一个 .? 没有括号包围,所以不是分组,匹配效果一个或零个任意字符(除了换行符以外)。
matchObj.span() 会返回匹配到的字符串在原字符串中的索引的起始和结束位置
matchObj.group() 等同于 matchObj.group(0),表示匹配到的完整文本字符
matchObj.group(1) 得到第一组匹配结果,也就是(.*)匹配到的
matchObj.group(2) 得到第二组匹配结果,也就是(.*?)匹配到的
因为只有匹配结果中只有两组,所以如果填 3 时会报错。

re.search方法

re.search扫描整个字符串并返回第一个成功的匹配。

re.search(pattern,string,flags = 0)
   pattern : 匹配的正则表达式
   string  : 要匹配的字符串
   flags   : 正则表达式修饰符 - 可选标志,用于控制正则表达式的匹配方式,如 : 区分大小写,多行匹配等等

re.sub方法——检索与替换

re.sub(pattern, repl, string, count=0, flags=0)
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
import re
phone = "2004-959-559 # 这是一个国外电话号码"
# 删除字符串中的 Python注释
num = re.sub(r'#.*$', "", phone)
print("电话号码是: ", num)
# 删除非数字(-)的字符串
num = re.sub(r'\D', "", phone)
print("电话号码是 : ", num)

输出:  

电话号码是:  2004-959-559 
电话号码是:  2004959559

findall

在字符串中找到正则表达式匹配的所有字符串,并返回一个列表,如果没有找到匹配的,则返回空列表。

findall(string[, pos[, endpos]])
string : 待匹配的字符串。
pos : 可选参数,指定字符串的起始位置,默认为 0。
endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度

注意: match 和 search 是匹配一次 findall 匹配所有
import re
 
pattern = re.compile(r'\d+')   # 查找数字
result1 = pattern.findall('runoob 123 google 456')
result2 = pattern.findall('run88oob123google456', 0, 10)
print(result1)
print(result2)

输出:

扫描二维码关注公众号,回复: 2588267 查看本文章
['123', '456']
['88', '12']

re.finditer

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

re.finditer(pattern,string,flags = 0)
   pattern : 匹配的正则表达式
   string  : 要匹配的字符串
   flags   : 正则表达式修饰符 - 可选标志,用于控制正则表达式的匹配方式,如 : 区分大小写,多行匹配等等

re.split()

split方法按照能够匹配的字符串将字符串分割后返回列表,它的使用形式如下:

re.split(pattern, string[, maxsplit=0, flags=0])
maxsplit 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
flags : 正则表达式修饰符 - 可选标志

对于一个找不到匹配项的字符串而言,split不会对其作出任何分割


猜你喜欢

转载自blog.csdn.net/m0_37717595/article/details/80741646