python 正则表达式 中级

1.子表达式

将几个字符的组合形式看做一个大的字符,例如匹配IP地址,形如 127.0.0.1
答案一:p1='\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
pattern1 = re.compile(p1)
测试数据:aa='127.0.0.1'或'.tyw127.0.0.1rceaa'或'1.2.tyw127.0.0.1rceaa'
re.search(pattern1,aa).group(0)
结果:'127.0.0.1'
pattern1.findall(aa)
结果:['127.0.0.1']
 
答案二:p1='(\d{1,3}\.){3}\d{1,3}'
pattern1 = re.compile(p1)
aa='1.2.tyw999.000.3.4.5.6rceaa'
re.search(pattern1,aa).group(0)
结果:'999.000.3.4'
pattern1.findall(aa)
结果:['3.']

2.向前向后查找

举例一:p1 = r"(?<=<h1>).+?(?=</h1>)"
第一个?<=表示在被匹配字符前必须得有<h1>,后面的?=表示被匹配字符后必须有</h1>
简单来说,p = r"(?<=A)XX(?=B)" 匹配的是AXXB这样的字符串中的XX
 
举例二:p1 = r"(?<={0}).+?(?=\n)".format('Undistort Flag: ')
    pattern1 = re.compile(p1)                         #编译正则表达式
    matcher1 = re.search(pattern1, output)  #在源文本中搜索符合正则表达式的部分
    rtv_lag = matcher1.group(0)
    print '~~~~~~~~`',rtv_lag
 
向前查找向后查找不必同时出现,也可以只满足一个条件。只要记住?<=后面跟着的是前缀要求,?=后面跟的是后缀要求即可。

3.回溯引用

回溯引用是一个动态的正则表达式,让你根据实际情况进行匹配。
例如想要匹配HTML页面中<h1></h1>到<h6></h6>中的内容,如果简单地使用表达式p = r"<h[1-6]>.*?</h[1-6]>"可能会匹配出多余的标签为<h1>hello world</h3>的数据;针对这种情况,我们需要在匹配到第一个子表达式时获取到匹配到的值,需要可以使用回溯引用。
答案:p1 = r"<h([1-6])>.*?</h\1>"
其中,第二个子表达式中出现了\1,这里的1表示第一个子表达式,它是动态的,随着前面第一个子表达式的匹配到的东西而变化的。比如前面的子表达式内是[1-6],在实际字符串中找到了1,那么后面的\1就是1,如果前面的子表达式在实际字符串中找到了2,那么后面的\1就是2。
类似的,\2,\3,....就代表第二个第三个子表达式。

参考:https://www.cnblogs.com/chuxiuhong/p/5907484.html

 

posted @ 2019-12-19 16:52  声声慢43  阅读(277)  评论(0编辑  收藏  举报