爱根,正则表达式re模块。。。
Posted 钟爱一根
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爱根,正则表达式re模块。。。相关的知识,希望对你有一定的参考价值。
就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。
字符匹配(普通字符,元字符):
1 普通字符:大多数字符和字母都会和自身匹配:
import re
print(re.findall("a","abc")) #[\'a\']
2 元字符:. ^ $ * + ? { } [ ] | ( ) \\
元字符之. ^ $ * + ? { }
import re # ret = re.findall(\'a..in\', \'helloalvin\') # print(ret) # [\'alvin\'] # # ret = re.findall(\'^a...n\', \'alvinhelloawwwn\') # print(ret) # [\'alvin\'] # # ret = re.findall(\'a...n$\', \'alvinhelloawwwn\') # print(ret) # [\'awwwn\'] # # ret = re.findall(\'a...n$\', \'alvinhelloawwwn\') # print(ret) # [\'awwwn\'] # # ret = re.findall(\'abc*\', \'abcccc\') # 贪婪匹配[0,+oo] # print(ret) # [\'abcccc\'] # # ret = re.findall(\'abc+\', \'abccc\') # [1,+oo] # print(ret) # [\'abccc\'] # # ret = re.findall(\'abc?\', \'abccc\') # [0,1] # print(ret) # [\'abc\'] # # ret = re.findall(\'abc{1,4}\', \'abccc\') # print(ret) # [\'abccc\'] 贪婪匹配
注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配
# ret=re.findall(\'abc*?\',\'abcccccc\')
# print(ret) #[\'ab\']
元字符之字符集[]:
ret = re.findall(\'a[bc]d\', \'acd\') print(ret) # [\'acd\'] ret = re.findall(\'[a-z]\', \'acd\') print(ret) # [\'a\', \'c\', \'d\'] ret = re.findall(\'[.*+]\', \'a.c*d+\') print(ret) # [\'.\',\'*\' ,\'+\'] # 在字符集里有功能的符号: - ^ \\ ret = re.findall(\'[1-9]\', \'45dha3\') print(ret) # [\'4\', \'5\', \'3\'] ret = re.findall(\'[^ab]\', \'45bdha3\') print(ret) # [\'4\', \'5\', \'d\', \'h\', \'3\'] ret = re.findall(\'[\\d]\', \'45bdha3\') print(ret) # [\'4\', \'5\', \'3\']
ret = re.findall(\'[.\\-*\\^+\\\\\\\\]\', r\'a.^c*d+-\\\\\') #代表后面是原生字符串,两个\\,在显示的时候,解释器会将每个\\转为\\\\显示出来。
print(ret) #[\'.\', \'^\', \'*\', \'+\', \'-\', \'\\\\\', \'\\\\\']
ret = re.findall(\'[.\\-*\\^+\\\\\\\\]\', \'a.^c*d+-\\\\\') #代表后面是一个\\,因为没有加r来代表原生字符串。
print(ret) #[\'.\', \'^\', \'*\', \'+\', \'-\', \'\\\\\']
ret = re.findall(\'[.\\-*\\^+\\\\\\\\]\', r\'a.^c*d+-\\m\')
print(ret) #[\'.\', \'^\', \'*\', \'+\', \'-\', \'\\\\\']
ret = re.findall(\'[.\\-*\\^+\\\\\\\\]\', r\'a.^c*d+-\\\\\')
print(ret) #[\'.\', \'^\', \'*\', \'+\', \'-\', \'\\\\\',\'\\\\\']
# ret = re.findall(\'[.\\-*\\^+\\\\\\\\]\', \'a.^c*d+-\\m\\\') #后面不能是\\\'因为代表把\'也转义了。
# print(ret)
# ret = re.findall(\'[.\\-*\\^+\\\\\\\\]\', r\'a.^c*d+-\\m\\\') #无论是否是原生字符串,\\都有转义的功能,如上。
# print(ret)
ret = re.findall(\'[.\\-*\\^+\\\\\\\\]\', \'a.^c*d+-\\m\\\\\') #字符串后面两个\\\\到解释器里转化为一个。
print(ret) #[\'.\', \'^\', \'*\', \'+\', \'-\', \'\\\\\', \'\\\\\']
ret = re.findall(\'[.\\-*\\^+\\\\\\\\]\', r\'a.^c*d+-\\a\') #加上r后,表明里面的\\a不再有意义。
print(ret) #[\'.\', \'^\', \'*\', \'+\', \'-\', \'\\\\\']
ret = re.findall(\'[.\\-*\\^+\\\\\\\\]\', \'a.^c*d+-\\a\') #这个\\a代将无意义的a转化为有意义的了,所以判断不出来。
print(ret) #[\'.\', \'^\', \'*\', \'+\', \'-\']
因为\\\\\\\\可以拆分为\\\\ \\\\,前两个\\\\交给解释器代表就是一个实实在在的\\,然后后面两个代表他就是一个实实在在的\\,通过两个实实在在的\\\\,代表就是转义出一个没有任何意义
的\\。
# ret=re.findall(\'c\\l\',\'abc\\le\') #报错。
# print(ret)#[]
# ret=re.findall(\'c\\\\l\',\'abc\\le\') #报错。
# print(ret)#[]
ret=re.findall(\'c\\\\\\\\l\',\'abc\\le\') #[\'c\\\\l\']
print(ret)#[\'c\\\\l\']
ret=re.findall(r\'c\\\\l\',\'abc\\le\') #[\'c\\\\l\']
print(ret)#[\'c\\\\l\']
元字符之转义符\\
反斜杠后边跟元字符去除特殊功能,比如\\.
反斜杠后边跟普通字符实现特殊功能,比如\\d
\\d 匹配任何十进制数;它相当于类 [0-9]。
\\D 匹配任何非数字字符;它相当于类 [^0-9]。
\\s 匹配任何空白字符;它相当于类 [ \\t\\n\\r\\f\\v]。
\\S 匹配任何非空白字符;它相当于类 [^ \\t\\n\\r\\f\\v]。
\\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
\\b 匹配一个特殊字符边界,比如空格 ,&,#等
ret=re.findall(\'I\\b\',\'I am LIST\')
print(ret)#[]
ret=re.findall(r\'I\\b\',\'I am LIST\')
print(ret)#[\'I\']
ret=re.findall(\'I\\\\b\',\'I am LIST\')
print(ret)#[\'I\']
元字符之分组()
m = re.findall(\'(ad)+\', \'addad\') print(m) #[\'ad\', \'ad\'] m = re.findall(\'\\d+(?P<id>ad)+\', \'1234adadad\') #巨鸡巴蛋疼 print(m) #[\'ad\']
m = re.findall(r\'\\d+(?:ad)+\', \'1234adadad\')
print(m) #[\'1234adadad\']
ret = re.search(\'(?P<id>\\d{2})/(?P<name>\\w{3})\', \'23/com\') print(ret.group()) # 23/comprint(ret.group("id")) # 23
ret
=
re.findall(
\'www.(baidu|oldboy).com\'
,
\'www.oldboy.com\'
)
print
(ret)
#[\'oldboy\'] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
ret
=
re.findall(
\'www.(?:baidu|oldboy).com\'
,
\'www.oldboy.com\'
)
print
(ret)
#[\'www.oldboy.com\']
元字符之|
ret=re.search(\'(ab)|\\d\',\'rabhdg8sd\') print(ret.group())#ab
常用方法
# 1 a=re.findall(\'a\', \'alvin yuan\') # 返回所有满足匹配条件的结果,放在列表里 print(a) #[\'a\', \'a\'] # 2 a=re.search(\'a\', \'alvin yuana\').group() # 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以 # 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。 print(a) #a a=re.search("a","12345") # print(a.group()) #报错。 # 3 a=re.match(\'a\', \'abcava\').group() # 同search,不过尽在字符串开始处进行匹配 print(a) # 4 ret = re.split(\'[ab]\', \'abcd\') # 先按\'a\'分割得到\'\'和\'bcd\',在对\'\'和\'bcd\'分别按\'b\'分割 print(ret) # [\'\', \'\', \'cd\'] # 5 ret = re.sub(\'\\d\', \'abc\', \'alvin5yuan6\', 1) #只分割一次,并替换。 print(ret) # alvinabcyuan6 ret = re.subn(\'\\d\', \'abc\', \'alvin5yuan6\') #全部分割,并显示分割次数。 print(ret,type(ret)) #\'alvinabcyuanabc\', 2) # 6 obj = re.compile(\'\\d{3}\') ret = obj.search(\'abc123eeee\') print(ret.group()) # 123
得到一个迭代器
ret = re.finditer(\'\\d\', \'ds3sy4784a\') #得到一个迭代器。 print(ret) # <callable_iterator object at 0x10195f940> print(next(ret).group()) print(next(ret).group())
高阶实验
#匹配出所有的整数
ret=re.findall(r"-?\\d+\\.\\d*|(-?\\d+)","1-2*(60+(-40.35/5)-(-4*3))") ret.remove("") print(ret) #[\'1\', \'-2\', \'60\', \'5\', \'-4\', \'3\'] ret=re.findall(r"-?\\d+\\.\\d*|(?:-?\\d+)","1-2*(60+(-40.35/5)-(-4*3))") print(ret) #[\'1\', \'-2\', \'60\', \'-40.35\', \'5\', \'-4\', \'3\'] ret=re.findall(\'(ab)|\\d\',\'rabhdg8sd\') print(ret) #[\'ab\', \'\'] ret.remove("")
import re print(re.findall("<(?P<tag_name>\\w+)>\\w+</(?P=tag_name)>","<h1>hello</h1>")) #引用?P print(re.search("<(?P<tag_name>\\w+)>\\w+</(?P=tag_name)>","<h1>hello</h1>")) print(re.search(r"<(\\w+)>\\w+</\\1>","<h1>hello</h1>")) #引用/1
以上是关于爱根,正则表达式re模块。。。的主要内容,如果未能解决你的问题,请参考以下文章