爱根,正则表达式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/com
print(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模块。。。的主要内容,如果未能解决你的问题,请参考以下文章

python中的re模块

第43天python学习re模块学习

常用模块-正则re

python成长之路第三篇_正则表达式

python成长之路第三篇_正则表达式

python知识-正则表达式re模块