Python re正则模块
程序员文章站
2022-07-10 13:50:28
...
问题描述:
对于比较复杂的字符串处理任务,需要依靠正则表达式。
使用流程:
首先需要导入 re 模块
import re
常用的元字符
符号 | 含义 |
---|---|
. | 匹配除 “\n” 和 “\r” 之外的任何单个字符。 |
^ | 匹配字符串开始位置 |
$ | 匹配字符串结束位置 |
* | 前面的元素重复0次,1次或多次 |
? | 前面的元素重复0次或1次 |
+ | 前面的元素重复1次或多次 |
{n} | 前面的元素出现了n次 |
{n, } | 前面的元素至少出现n次 |
{n. m} | 前面的元素出现的次数介于n-m之间 |
( ) | 进行分组,输出括号中的部分 |
常用的通用字符
符号 | 含义 |
---|---|
\s | 匹配空白字符 |
\w | 匹配任意字母/数字/下划线 |
\W | 匹配任意字母/数字/下划线以外的字符 |
\d | 匹配十进制数字 |
\D | 匹配十进制数字以外的值 |
[0-9] | 匹配一个0~9之间的数字 |
a-z | 匹配小写英文字母 |
A-Z | 匹配大写英文字母 |
常用的函数
search
search方法能够找出子串第一个匹配位置
import re
s = 'hello world. hello world.'
key_word = 'world'
# 找到后返回re.Match object
r = re.search(key_word, s)
# 返回一个元组包含匹配 (开始,结束) 的位置
r.span()
match
match从原字符串的开始位置匹配(search函数是从任意位置匹配)
finditer
匹配迭代器
返回所有匹配位置的迭代器
返回对象是 re.Match, 可以使用 span() 方法找到它的开始和结束位置
import re
s = 'hello world. hello world.'
key_word = 'world'
r = re.finditer(key_word, s)
for i in r:
print(i.span())
findall
re.findall遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表
re.I
re.I是方法的可选参数,表示忽略大小写。
s = "That"
pat = "t"
r = re.finditer(pat, s, re.I)
for i in r:
print(i.span())
split
字符串中的split函数只能分割简单的情况
如果字符串的分隔符有 , ; \t |
words = re.split(r'[,\s;|]+', s)
sub
替换匹配到的字符串
content = "hello world, hello world"
# 要替换的部分
pattern = re.compile(r'world')
m=pattern.sub("kitty", content)
compile
预编译方法,如果要用同一匹配模式进行多次匹配,可以使用compile预先编译串,可以提升运行效率
贪心捕获与非贪心捕获
(.*) 表示捕获任意多个字符,尽可能多的匹配字符,要找到最后一个匹配的,把中间部分返回,也被称为贪心捕获
(.*?)非贪心捕获,找到第一个匹配后返回,把中间部分返回,称为非贪心捕获
案例
匹配浮点数和整数
import re
s = 's2sss1.02sssss5s'
pattern = r'\d+\.?\d*'
r = re.findall(pattern, s)
匹配正整数
第一个数为大于1-9
第二个为0-9,可以存在或不存在
import re
s = [-16, 1.02, 5, 0, 127, a]
pattern = r"^[1-9]\d*$"
[i for i in s if re.match(pattern, str(i))]
上一篇: nginx配置详解