python正则表达式


常用正则表达式来对爬取的网页进行解析,但是正则表达式的构造稍微复杂一点,一般在结构化的网页中没必要用正则(易出错)

# findall
a = re.findall('jianeng',s )  ## 搜索字符串,以列表类型返回全部能匹配的子串
print(a)

#search()     # 在一个字符串中搜索,匹配正则表达式的第一个位置,返回match对象 <_sre.SRE_Match object; span=(1, 8), match='jianeng'> 只能找到第一次出现的
a = re.search('jianeng',s)
print(a)

#finditer()    # 搜索字符串,返回一个匹配结果的迭代类型,
              # 每个迭代元素是match对象

s = 'sjianengsdfasjianeng15sadfjianeng666'
finditer = re.finditer('jianeng',s)
print(finditer )

##获取match对象中的值
for i in finditer:
    print(i)
    print(i.group())     #froup() 返回匹配到的字符串
    print(i.start() )    #返回匹配的开始位置
    print(i.end() )        #返回匹配的结束位置
    print(i.span() )      # 返回一个元组表示匹配位置(开始,结束)


#sub()         # 替换 类似于字符串中 replace() 方法
s2 = re.sub('jianeng','666',s,count=2)
print(s2)


# compile()        # 编译正则表达式为模式对象
a = re.compile('jianeng')   # a 要匹配jianeng
dd='fsadfasfjkjianeng'
b = a.findall(dd)
print(b )

#re.split()    # 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型
c = re.split('jianeng',s,maxsplit=2)
print(c)


import re

#####元字符
##通配符  -> .  点 -> 表示任意一个字符
res = re.findall(r'a','abcad')   #统一使用r取消转义  去右边字符串中找所有满足左边格式的子字符串
print(res)   #['a', 'a']

res =  re.findall(r'a..','abcad')
print(res)   #['abc']

##锚点元字符
# ^ 锁定行首
res =  re.findall(r'^a.','abcad')
print(res)    #['ab']

# $ 锁定行尾
res =  re.findall(r'a.$','abcad')
print(res)   # ['ad']

##单词边界(不是元字符):   \b
res =  re.findall(r'dog','Just dog Monica doggie Irene')
print(res)    # ['dog', 'dog']    #第二个dog不是单独的dog单词

res =  re.findall(r'\bdog\b','Just dog Monica doggie Irene')
print(res)      # ['dog']


###重复元字符

####贪婪  (尽可能匹配的多)
res =  re.findall(r'ab{4}c','abbbbc')   #连续4个b   把花括号前面紧挨着的重复多少次
print(res)     #['abbbbc']

res =  re.findall(r'ab{2,4}c','abbbc')   #匹配2到4个b      #正则不许加空格
print(res)     #['abbbc']

res =  re.findall(r'ab{2,}c','abbbbbbbbbc')      #匹配2的到多个,至少2个
print(res)       #['abbbbbbbbbc']

###
res =  re.findall(r'ab*c','abbbc')   #   * 任意多个重复, 相当于{0,}
print(res)

res =  re.findall(r'ab+c','abbbc')   #   * 一个或多个,一到正无穷,相当于 {1,}
print(res)

res =  re.findall(r'ab?c','abbbc')   #   *    一个或者没有 ,相当于 {0,1}
print(res)

######非贪婪  (尽可能匹配的少)   后面加一个 ?
res =  re.findall(r'ab*','abbc')   # 这是贪婪
print(res)   #['abb']

res =  re.findall(r'ab*?','abbc')
print(res)   # 这是非贪婪

# *? #任意多个
# +? #一个或多个
# ?? #一个或没有


###选择元字符   |
res =  re.findall(r'ab|bc','abc-adc-aec-bca')   #二选一   #  | 或
print(res)   # ['ab', 'bc']                      #选的是正则表达式

res =  re.findall(r'a[bd]c','abc-adc-aec-bca')   # 多选一 , [] 方括号 表示你想要列举的所有情况,但是,仅仅一个字符
print(res)   #  ['abc', 'adc']                   #选的是方括号里面的一个字符    ,  【】里面的逗号表示匹配逗号

res =  re.findall(r'a[^bd]c','abc-adc-aec-bca')   #   ^在[]里面的话,放在第一位,表示反向
print(res)   #  除了b和d

res =  re.findall(r'a[a-e]c','abc-adc-aec-bca-a^c')   #用 - 连接表示范围   [a-zA-Z0-9_]任意字母数字下划线
print(res)

####转义元字符      匹配字符本身   \ 反斜杠
res =  re.findall(r'.+.','1+2')
print(res)   #['1+2'] 不是匹配到了加号

res =  re.findall(r'1\+2','1+2')   #得到元字符的字面值
print(res)  #['1+2']

######预定义字符类
# \d  #任一数字字符   -> [0-9]
# \D  #任一非数字字符  -> [^0-9]
# \s  #任一空白符    -> [\t\n\x0B\f\r]
# \S  #任一非空白符    -> [^\t\n\x0B\f\r]
# \w  #任一字母数字字符  -> [a-zA-Z0-9]
# \W  #任一非字母数字字符  -> [^a-zA-Z0-9]


######分组
res =  re.findall(r'a(bc)+d','abcbcbcd')    #只能匹配一个bc  括号里面的变成一个整体     一个括号就是一个组
print(res)    # ['bc']

res =  re.findall(r'(a(bc)+d)','abcbcbcd')    #大组套小组
print(res)     # [('abcbcbcd', 'bc')]

res =  re.findall(r'a(b|c)c','abc-acc-adc-aec')   #与a[bc]c类似
print(res)     # ['b', 'c']

##按组提取数据
res =  re.findall(r'(\w+)-(\w+)-(\w+)-(\w+)','abc-dc-acc-aaec')
print(res)   # [('abc', 'acc', 'adc', 'aec')]

res =  re.search(r'(?P<year>\d+)-(?P<month>\d+)-(?P<day>\d+)','2018-03-13')
print(res.groupdict())    # {'year': '2018', 'month': '03', 'day': '13'}


"""
注意:
如果正则表达式中使用了括号,
那么findall函数匹配的结果
只会是括号中的内容,
而不是完整的匹配。

因此我们可以利用这种机制来
完整对需要部分的数据提取

"""

文章作者: 剑胆琴心
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 剑胆琴心 !
评论
 上一篇
python之requests库 python之requests库
Requests是基于urllib3来改写的,采用Apache2 Licensed 来源协议的HTTP库。 它比urllib更加方便,可以节约我们大量的工作,完全满足HTTP测试需求。 安装pip install requests 使用测试
2020-02-17
下一篇 
中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式
中缀表达式转换后缀表达式3.1 规则 1、初始化栈和集合:运算符号栈s1和存储空间集合s2 2、从左到右扫描中缀表达式 3、遇到操作数时,将其加入s2 4、遇到运算符时,比较其与s1栈顶运算符的优先级 - 4.1、如果s1为空,或栈顶
  目录