欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python中的re模块(正则表达式)

程序员文章站 2024-03-09 10:04:29
...

re模块是python中特有的,但是正则表达式是通用的。

正则表达式介绍

re模块常用函数


正则表达式介绍

(1)特殊符号处理常用逻辑

符号 含义 正则表达式 可以匹配的例子 不可能匹配的例子
. 匹配任一字符 "a.c" "abc",''amc" "addc","addds"
^ 匹配以某个字符开始的字符串 "^a" "accc" "vccc"
$ 匹配以某个字符结尾的字符串 "a$" "csada" "ssum"
[] 匹配多个字符,可以将[]看作字典查找匹配 "[abcd]" "ab"

"mn" 

[^...] 匹配非字符组中的字符 "[^abc]" "ssds" "abc"
a|b 匹配a或者b "root|cat" "root" "big"
() 匹配括号内的表达式 "(k|d)ing" "ding" "crying"

       重复型的匹配符号

符号 含义 正则表达式 可以匹配的例子
+ 匹配一次或多次 "(a|c)+d$" "ad","caccd"
* 匹配零次或多次 "(a|c)*d$" "d","aaad"
? 匹配零次或一次 "(a|c)?d$" "ad","cd","d"
{n} 匹配确定的 n次(n为正整数) "[0-9]{2}"       "21","26"
{n,} 至少匹配n次 "[0-9]{3,}"        "001","003003"
{n,m} 最少匹配 n次且最多匹配 m 次 "[0-9]{2,4}"          "23","231","6551"

关于[]一些常用的匹配:

字符 含义
[0-9] 匹配0-9这10个数字
[a-z] 匹配a-z这26个小写字母
[A-Z] 匹配A-Z这26个大写字母
[a-f0-7F-M] 匹配a-f小写字母,匹配0-7数字,匹配F-M大写字母

转义字符 : \

在[]中有一些表达需要看作特殊符号,因此需要用到"\"。如果想要匹配某段文字中的一个"\",则需要4个反斜杠"\\\\"(在正则中需要4个)。解释:前两个反斜杠出来一个"\",后两个反斜杠也出来一个"\",这两个被送进正则表达中,由于"\"在正则中,有转义的作用,因此"\\"被翻译成一个普通的斜杠。

这时,可以利用原声字符串来解决这个问题,上面的这个可以写成 r"\\",即"\\"不转义直接送到正则表达式中,因此正则表达式读取后就是"\"。

在正则表达式中,转义字符加一些字母有一些特殊的意思,如下表所示。

字符 说明 正则表达式 可以匹配的例子 不可以匹配的例子
\d 匹配一个数字 "aca\d" "aca2" "acas"
\s 匹配任意空白符 "a\sb" "a b" (一个空格) "abb"
\t 匹配一个制表符 "\t"    
\n 匹配一个换行符 "\nA"    
\w 匹配字母、数字、下划线 "a\wc" "a_c" "a$c"
\f 匹配一个换页符      
\b 匹配一个单词边界      

re模块常用函数

(1) re.match(regex, string, flags=0)

从字符串的起始位置匹配,匹配成功返回一个match对象,否则返回None

import re

regex = "a.c"
string = "abc"
print(re.match(regex,string))

output:
<_sre.SRE_Match object; span=(0, 3), match='abc'>

#含义:begin position:0 ;end position:3;match string is "abc"

(2) re.search(regex,string) 

扫描整个字符串并返回第一个成功的匹配的,如果没有就返回None

import re

regex = r"\d.\\c"
string = "1A\c2\sc"
print(re.search(regex,string))

output:
<_sre.SRE_Match object; span=(0, 4), match='1A\\c'>

(3)re.sub(regex, repl, string, count=0, flags=0)

替换字符串中的匹配项, regex 正则中的模式字符串,repl替换的字符串

count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配

flags是一个标志位,不怎么用不写了。

import re
regex = r'#.*$'
string = "2004-959-559 # 这是一个国外电话号码"
print(re.sub(regex,"",string))

output:
2004-959-559 

(4)re.compile(regex)

生成一个带有regex正则表达式的对象,供其他函数split,match,search使用。例子看(5)。

(5)re.split(regex, string,maxsplit)

按照能够匹配的子串将字符串分割后返回列表

import re
regex = "[a|b]+c"
pattern = re.compile("[a|b]+c")
string = "acbcbdcksnfcvscdbcacccbc"
print(re.split(regex,string,maxsplit=3)) #最大分隔3次
print(pattern.split(string))

output:
['', '', 'bdcksnfcvscd', 'acccbc']
['', '', 'bdcksnfcvscd', '', 'cc', '']

(6)re.findall(string,begin,end)

从字符串中找到匹配的所有子串,作为列表返回;如果没有找到匹配的,则返回空列表。

import re
pattern = re.compile("[a|b]+c")
string = "acbcbdcksnfcvscdbcacccbc"
print(pattern.findall(string))
print(pattern.findall(string,5,len(string))) 
### 从5位置开始匹配直到结尾

output:
['ac', 'bc', 'bc', 'ac', 'bc']
['bc', 'ac', 'bc']

(7)re.finditer(string)

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

import re
pattern = re.compile("[a|b]+c")
string = "acbcbdcksnfcvscdbcacccbc"
match = []
for i in pattern.finditer(string):
    match.append(i.group(0))
print(match)

output:
['ac', 'bc', 'bc', 'ac', 'bc']

 

参考:

https://www.runoob.com/python/python-reg-expressions.html