正则表达式(python)

正则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串使用含有某种子串、将匹配的子串替换或者是从某个串中取出某个条件的子串等。
正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。

正则表达式模式

  1. 数字和字母表示他们自身。
  2. 多数字母和数字前加一个反斜杠时会拥有不同的含义。
  3. 标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
  4. 反斜杠本身需要使用反斜杠转义。
模式(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
喜欢就支持一下吧
点赞0 分享