python正则表达式

1.基本介绍

  正则表达式是一个很强大的字符串处理工具,在网络爬虫过程中会不可避免的与字符串打交道,本文将介绍一下正则表达式的用法,也当做是自己的一个学习记录

2.用法介绍

2.1基本规则

[ ]

  a): 由一对方括号括起来的字符,表明一个字符集合,能够匹配包含在其中的任意一个字符,比如[123qwe],表明字符 '1' '2' '3' 'q' 'w' 'e'都符合匹配要求。

  b):在'[ ]'中还可以通过 ‘-’短横杠来指定一个字符集合范围,比如[a-z]来指示所有小写英文字母,[0-9]指示匹配所有数字。

  c):如果在'[ ]'里面的开头写一个 ‘^’号,则表示取非,如[^0-9]表示不匹配数字,但如果'^'不在开头,则不再表示取非,而表示一个普通字符,如[a-z^A-Z]表示匹配所有英文字符和字符'^'

|:

  将两个规则并列起来,以'|'连接,表示只要满足其中之一就可以匹配,比如[a-z]|[A-Z]表示匹配所有英文字母,等价于[a-zA-Z]。  

print(re.findall(r'[a-z]|[A-Z]', 'Asd'))
# 输出结果:['A', 's', 'd']
print(re.findall(r'[a-zA-Z]', 'Asd'))
# 输出结果:['A', 's', 'd']

.:

  匹配除换行符'\n'外所有字符,如果使用了'S'选项,匹配包括'\n'的所有字符

s = '123\n456\n789'
print(re.findall(r'.+', s))
#输出结果: ['123', '456', '789']
print(re.findall(r'.+', s, re.S))
#输出结果: ['123\n456\n789']

 ^ $:

  ^ 匹配字符串开头,在'M'模式下可以匹配每一行的行首

  $ 匹配字符串结尾,在'M'模式下可以匹配每一行的行尾

\d:

  匹配数字,等价于[0-9]

'\D':

  匹配非数字,等价于[^0-9]

'\w':

  匹配字母和数字,等价于[a-zA-Z0-9]

'\W':

  匹配非字母和数字,等价于[^a-zA-Z0-9]

'\s':

  匹配间隔符,即匹配空格,制表,回车等符号,等价于[\t\r\n\f\v]

'\S':

  匹配非间隔符,等价于[^\t\r\n\f\v]

'\A':

  匹配字符串开头,它和'^'的区别是'\A'只匹配字符串开头,而'^'在'M'模式下可以匹配其他行行首  

s = '123\nabc\n789'
print(re.findall('^\d', s, re.M))  # 匹配位于行首的数字
#运行结果: ['1', '7']
print(re.findall('\A\d', s, re.M))  # 匹配位于字符串开头的数字
#运行结果:['1']

 '\Z':

  匹配字符串结尾,它和'$'的区别是'\Z'只匹配字符串结尾,而'$'在'M'模式下可以匹配其他行行尾  

s = '123\nabc\n789'
print(re.findall('\d$', s, re.M))  # 匹配位于行尾的数字
# 运行结果:['3', '9']
print(re.findall('\d\Z', s, re.M))  # 匹配位于字符串尾的数字
# 运行结果:['9']

'\b':

  匹配单词边界,比如空格等,不过它是一个'0'长度字符,它匹配完的字符串不会包括那个分界的字符。而如果用'\s'来匹配的话,则匹配出的字符串中包含那个分界符。  

s = 'ab abcsd bc ab aaa'
print(re.findall(r'\bab\b', s))  # 匹配一个单独的单词 'ab',则当它是其他单词的一部分的时候不匹配
# 输出结果:['ab', 'ab']
print(re.findall(r'\sab\s', s))  # 匹配单独单词'ab' ,不过要注意 前后各有一个空格
# 输出结果:[' ab ']

'\B':

  和’\b’相反,它只匹配非边界的字符。它同样是个0长度字符。

2.2重复

'*':

  0或多次匹配,表示匹配前面的规则0次或多次

'+':

  1次或多次匹配,表示匹配前面的规则至少一次,可以多次匹配  

s = 'abbe abs2112 abs223bb 99cc'
print(re.findall(r'\b[a-z]+\d*\b', s))  # 必须至少一个字母开头,以连续数字或没有数字结尾
# 输出结果:['abbe', 'abs2112']

'?':

  0或1次匹配,表示只匹配前面规则的0次或1次

s = 'e212 abs2112 abs223bb w99cc 124'
print(re.findall(r'\b[a-z]?\d*\b', s))
# 输出结果:['e212', '', '', '', '', '', '', '', '124', '']

 

参考:https://docs.python.org/zh-cn/3.6/library/re.html

posted @ 2020-03-08 17:08  风墓  阅读(261)  评论(0编辑  收藏  举报