re模块
在python程序中使用正则呢需要借助re模块
-
findall 查找所有. 返回list
1 2 3 4
lst = re.findall("m", "mai le fo len, mai ni mei!") print(lst) # ['m', 'm', 'm'] lst = re.findall(r"\d+", "5点之前. 你要给我5000万") print(lst) # ['5', '5000']
-
search 会进行匹配. 但是如果匹配到了第一个结果. 就会返回这个结果. 如果匹配不上search返回的则是None
1 2
ret = re.search(r'\d', '5点之前. 你要给我5000万').group() print(ret) # 5
-
match 只能从字符串的开头进行匹配
1 2
ret = re.match('a', 'abc').group() print(ret) # a
-
finditer 和findall差不多. 只不过这时返回的是迭代器(重点)
1 2 3
it = re.finditer("m", "mai le fo len, mai ni mei!") for el in it: print(el.group()) # 依然需要分组
-
compile() 可以将一个长长的正则进行预加载. 方便后面的使用
1 2 3
obj = re.compile(r'\d{3}') # 将正则表达式编译成为一个 正则表达式对象, 规则要匹配的是3个数字 ret = obj.search('abc123eeee') # 正则表达式对象调用search, 参数为待匹配的字符串 print(ret.group()) # 结果: 123
-
正则中的内容如何单独提取?
单独获取到正则中的具体内容可以给分组起名字
1 2 3 4 5 6 7 8 9
s = """ <div class='西游记'><span id='10010'>中国联通</span></div> """ obj = re.compile(r"<span id='(?P<id>\d+)'>(?P<name>\w+)</span>", re.S) result = obj.search(s) print(result.group()) # 结果: <span id='10010'>中国联通</span> print(result.group("id")) # 结果: 10010 # 获取id组的内容 print(result.group("name")) # 结果: 中国联通 # 获取name组的内容
在正则表达式中,?P
是一个命名捕获组的语法,它用于给捕获组命名,以便于之后可以通过名字来引用匹配到的文本。这里的各个部分含义如下: ?P:这是命名捕获组的开始标记,告诉正则表达式解析器接下来的内容是一个命名捕获组。
:这是捕获组的名称,你可以自定义一个有意义的名字。这个名字在匹配后的操作中用来引用这个捕获组匹配到的文本。 使用命名捕获组的好处是,代码可读性更强,也更容易理解每个捕获组的作用,特别是在处理复杂的正则表达式时。在Python的re模块中,一旦命名捕获组匹配成功,你可以使用group()方法并传入捕获组的名字来获取相应的匹配文本。
-
正则表达式本身是用来提取字符串中的内容的. 也可以用作字符串的替换
1 2 3 4 5 6
import re r = re.split(r"\d+", "我今年19岁了, 你知道么, 19岁就已经很大了. 周杰伦20岁就得奖了") print(r) # ['我今年', '岁了, 你知道么, ', '岁就已经很大了. 周杰伦', '岁就得奖了'] # 替换 r = re.sub(r"\d+", "18", "我今年19岁了, 你知道么, 19岁就已经很大了. 周杰伦20岁就得奖了") print(r) # 我今年18岁了, 你知道么, 18岁就已经很大了. 周杰伦18岁就得奖了
哦了. 正则. 这些东西够用了.