网络爬虫_re正则表达式

"""正则表达式re

概念
    检索符合某个规则的字符串。
    通用的字符串表达框架。
    简洁表达一组字符串。

常用
    表达文本类型的特征。
    同时查找或替换一组字符串。
    匹配字符串全部或部分。"""


# --------------------------------------
"""正则表达式语法

常用操作符
    .    # 表示任何单字符。
    []   # 字符集,对单个字符给出取值范围。[abc][a-z]
    [^]  # 非字符集。[^abc]除了abc以外的单个字符
    *    # 前一个字符0次或无限次扩展。
    +    # 前一个字符1次或无限次扩展。
    ?    # 前一个字符0次或1次扩展。
    |    # 左右表达式任意一个,等同于或。
    
    {m}  # 扩展前一个字符m次,ab{2}c表示abbc。
    {m, n}  # 扩展前一个字符m或n,ab{1, 2}c表示abc和abbc。
    ^    # 匹配字符串开头,^abc表示字符串abc且在一个字符串开头。
    $    # 匹配字符串结尾,abc$表示字符串abc且在一个字符串结尾。
    ()   # 分组标记,(abc|def)表示abc和def。
    \d   # 数字,等价于[0-9]。
    \w   # 单词字符,等价于[A-Za-z0-9]。

pattern = r'abc(.*?)abc'  # 匹配到abc和abc之间的部分,不会匹配到abc
pattern = r'abc.*?abc'  # 匹配abc到abc,包括两端abc六个字符。
    
    
实例
P(Y|YT|YTH|YHTO)?N  # 'PN' 'PYN' 'PYTN' 'PYTHN' 'PYTHON'
PYTHON+  # 'PYTHON' 'PYTHONN' 'PYTHONNN' ... ...
PY[TH]ON  # 'PYTON' 'PYHON'
PY{:3}N  # 'PN' 'PYN' 'PYYN' 'PYYYN'

IP地址
\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}  # 表示四个用.分隔开的三位数。
精确表示
0-99: [1-9]?\d
100-199: 1\d{2}
200-249: 2[0-4]\d
250-255: 25[0-5]
IP: (([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5]).){3}([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])
# {3}重复三个0-255的数字后加'.' 最后加一个0-255的数字。"""



# ----------------------------------------------------
"""re库主要功能函数
re.search()  # 搜索第一个匹配正则表达式的对象。
re.match()  # 只在开始位置搜索匹配对象。
re.findall()  # 搜索整个字符串,返回全部匹配对象, 返回列表类型。
re.split()  # 按匹配结果进行分割,返回列表类型。
re.finditer()  # 搜索字符串,返回第一个匹配结果的迭代类型。
re.sub()  # 替换所有匹配字符串,返回替换后的字符串。


pattern  # 正则表达式字符串,原生字符串。
string  # 要匹配的字符串。
flags  # 正则表达式使用时的控制标记。

re.search(pattern, string, flags=0)
re.match(pattern, string, flag=0)
re.sub(pattern, repl, string, count=0, flags=0)
repl  # 替换匹配字符串的字符串。
count  # 替换匹配的最大次数。"""


import re
match = re.search(r'[1-9]\d{5}', 'BIT 100081')
print(match.span())  # (4, 10)匹配到的字符位置
print(match.group())


match1 = re.match('[1-9]\d]{5}', 'BIT 100081')
if match1:  # 如果match1中没有匹配到元素,输出None.
    print(match.group())
else:
    print('None')


li = re.findall(r'[1-9]\d{5}', 'BIT 100081 IAS 124565')
print(li)  # findall返回的是一个列表


li1 = re.split(r'[1-9]\d{5}', 'BIT 100081 IAS 124565')
print(li1)  # ['BIT ', ' IAS ', ''] 将匹配到的部分去掉,分割剩下的字符串。


r"""(字符串前面加r表示使用真实字符,不作转义。例如\t为真实字符,不作为制表符。)
"."         匹配除换行符以外的字符。
[]          字符集合,匹配中括号中任意一个包含的字符。
[a-z]       匹配任意一个小写字母。
[A-Z]       匹配任意一个大写字母。
[0-9]       匹配任意一个数字。
[0-9a-zA-Z] 匹配任意一个大写字母、小写字母、数字。
[0-9a-zA-Z_]匹配任意一个大写字母、小写字母、数字和下划线。
[^sam]      匹配除了's', 'a', 'm'这几个字母外所有字符。
            ^为脱字符,表示不匹配集合中的字符。
\d          相当于[0-9]。
\D          相当于[^0-9]。
\w          相当于[0-1a-zA-Z_]数字字母和下划线。
\W          相当于[^0-9a-zA-Z_]非数字、字母和下划线。
\s          [ \f\n\r\t]匹配任意空白字符(空格,换行,回车,换页,制表)。
\S          [^ \f\n\r\t]匹配任意非空白字符(空格,换行,回车,换页,制表)。
"""
 
# 匹配多个字符
"""
(xyz)    xyz作为一个整体匹配。
x?       匹配0个或者1个x。
x*       匹配0个或者任意多个x(.*表示匹配0个或者任意多个字符,换行符除外)。
x+       匹配至少一个x
x{n}     匹配n个x
x{n,m}   匹配至少n个至多m个x
x|y      匹配x或者y
"""
 
 
# 注释: part2
str = " part2 "
# 第2,3个/为转义字符,表示*作为字符串,并不是正则表达式
print(re.findall("/", str))
 
    #### finditer函数 ####
import re
"""
re.finditer函数
格式:finditer(patter, string, flags)
功能:与findall类似,扫描整个字符串,返回一个迭代器。
参数:
patter:匹配的正则表达式
string:匹配的字符串
flags:标志位
"""
str = "sam is a good man, sam is a nice man, sam is a very handsome man!"
d = re.finditer(r"(sam)", str)
while True:
    try:
        l = next(d)
        print(l)
    except StopIteration as e:
        break
 
    #### 替换字符串 ####
import re
 
"""
字符串的替换和修改
sub(pattern, repl, string, count=0, flags=0)
subn(pattern, repl, string, count=0, flags=0)
参数:
    pattern: 正则表达式
    repl: 指定的用来替换的字符串
    string: 字符串
    count: 最多替换次数
    flags: 标志位
功能:在目标字符串中用正则表达式的规则匹配字符串,
    并替换成指定的字符串,如果不指定次数则匹配替换全部字符换 
区别:sub返回被替换的字符串
    subn返回一个元组,第一个元组为被替换的字符串,第二个元组为替换次数
"""
str = "sam is a good man, sam is a nice man, sam is a very handsome man!"
sub = re.sub("sam", "Tom", str, count=2)
subn = re.subn("sam", "Tom", str, count=1)
print(sub)
print(subn)

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值