不懂先生

re正则提取
1.基础语法2.高级语法无论是先行还是后发,都是相对于xxx而言的,也就是相对于目标字符串而言。假如目标字符串后边...
扫描右侧二维码阅读全文
12
2021/08

re正则提取

1.基础语法

60074-cskawxsdggs.png
49318-uxw549bueh8.png
33401-w2kqdmbgsu.png
43007-m96pv76ulv.png

2.高级语法

无论是先行还是后发,都是相对于xxx而言的,也就是相对于目标字符串而言。
假如目标字符串后边有条件,可以理解为目标字符串在前,就用先行断言,放在目标字符串之后。
假如目标字符串前边有条件,可以理解为目标字符串在后,就用后发断言,放在目标字符串之前。
其实就是先看括号外的那个字符串,抽取括号里的子表达式看这俩是否同时并且按照去掉(?=)或者(?!)或者(?<=)或者(?<!)的顺序出现,若出现就输出括号外的字符串
假如指定满足某个条件,就是正。
假如指定不满足某个条件,就是负。
断言只是条件,帮你找到真正需要的字符串,本身并不会匹配!

20464-2c3ek1f0ipt.png

(1)先行断言

正向先行断言
#(?=pattern)表示正向先行断言,整个括号里的内容(包括括号本身)代表字符串中的一个位置,紧接该位置之后的字符序列能够匹配pattern。举个例子:
a = re.findall(r'n(?=al)','final')
b = re.findall(r'n(?=e)','python')
c = re.findall(r'n(?=e)','jasmine')
print(a)
print(b)
print(c)
#a的含义是先匹配n,如果n的右侧是al,则输出列表:['n'],;若没有找到al,或者找到n的右侧不是al,则输出空列表[]
本程序输出为:
['n']
[]
['n']
反向先行断言
(?!pattern)表示反向先行断言,与正向先行断言相反,紧接该位置之后的字符序列不能够匹配pattern。同样举个例子:
# (?!e)代表字符串中的一个位置,紧接该位置之后的字符序列只能够匹配e。
a = re.findall(r'n(?!e)','final')
b = re.findall(r'n(?!e)','python')
c = re.findall(r'n(?!e)','next')
print(a)
print(b)
print(c)
输出:
['n']
['n']
[]
#a的含义是:匹配final字符串里面的 n ,若 n 的右侧不是 e 则返回列表 ['n'] ,若匹配不到 n 或者紧随其后的第一个单词是 e,则返回空列表[]
注意:反向断言不支持匹配不定长的表达式,也就是说+、*字符不适用于反向断言的前后。
示例

使用正向先行断言获取字符串中以ing结尾的字符(不能为空)。

测试输入:I am singing while you are dancing;
预期输出:['sing', 'danc']。

import re
a = input()
#*********** Begin **********#
result = re.findall(r'[\w]{1,}(?=ing)',a)
#*********** End **********#
print(result)

(2)后发断言

正向后发断言

(?<=pattern)正向后发断言代表字符串中的一个位置,紧接该位置之前的字符序列只能够匹配pattern。

a = re.findall('(?<=a)n','final')
b = re.findall('(?<=a)n','command')
c = re.findall('(?<=i)n','negative')
print(a)
print(b)
print(c)
输出:
[]
['n']
[]
#a的意思先找到n,并且n的左侧是 a 时才会返回列表['n'],若没找到n,或者n的左侧不是a则返回
后发断言示例

使用正向后发断言匹配字符串中以go开头的字符的后半部分。
测试输入:good job;
预期输出:['od']。

import re

a = input()

#*********** Begin **********#
result = re.findall(r'(?<=go)[\w]{1,}',a)
#*********** End **********#
print(result)
反向后发断言

3.操作

# 正则表达式:字符串模式(判断字符串是否符合一定的标准)
import re
# 创建模式对象
pat = re.compile("AA")#此处的AA是正则表达式,用来验证其他字符串
m = pat.search("CBA")#search字符串是被校验的内容
print(m)#none代表没找到
m = pat.search("CBAA")
print(m)#<re.Match object; span=(2, 4), match='AA'>在下标为2开始到4(不包含4)存在这个AA
m = pat.search("AACBAAADDCC")
print(m)#知道第一个出现的

# 没有模式对象
m = re.search("asd","Aasd")#前面的字符串是模板 后面的字符串是被校验的对象
print(m)#<re.Match object; span=(1, 4), match='asd'>

print(re.findall("a","ASDaDFGAa"))#前面字符串是规则 后面字符串是被校验的 在后面的字符串里面找到所有符合这个标准的字符串 并输出

print(re.findall("[A-Z]","ASDaDFGAa"))#前面字符串是规则 后面字符串是被校验的 在后面的字符串里面找到所有符合这个标准的字符串 并输出
#输出['A', 'S', 'D', 'D', 'F', 'G', 'A']
print(re.findall("[A-Z]+","ASDaDFGAa"))#前面字符串是规则 后面字符串是被校验的 在后面的字符串里面找到所有符合这个标准的字符串 并输出
#输出['ASD', 'DFGA']从符合到不符合结束 然后再寻找


#sub 替换
print(re.sub("a","A","abcdcasd"))#找到小a 用大A替换  在第三个字符串里面
# 建议在正则表达式中,被计较的字符串前面加上r 不用担心转义字符的问题

a = r"\aabd-\'" #加上r就直接输出双引号里面的内容 /不当做转义字符
print(a) #输出 \aabd-\


4.资料网址

1.https://blog.csdn.net/ZYC88888/article/details/98479629
2.https://blog.csdn.net/qianhaohong/article/details/53435253
3.https://www.cnblogs.com/work115/p/5614199.html

Last modification:January 18th, 2022 at 04:28 pm

Leave a Comment