随笔 - 195  文章 - 3  评论 - 36  阅读 - 63万

小结:5分钟学会正则,解决98%爬虫需要做字符串提取的工作

介绍几种非常常用的特殊字符,解决98%爬虫需要做字符串提取的工作。

正则表达式最常见的字符

  • 1)特殊字符:就是一些有特殊含义的字符。 $ () * + . [ ? \ ^ { |

  • 2)限定符:用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。* + ? {n} {n,} {n,m}

  • 3)定位符:用来描述字符串或单词的边界。^ $

  • 4)其他字符:\w \W \s \S \d

直接进入python示例

1、介绍^ . * $的用法

  • 1)^ 匹配输入字符串开始的位置。
  • 2)字符. 匹配除换行符 \n 之外的任何单字符。
  • 3)字符* 匹配前面的子表达式零次或多次。
  • 4)字符 $ 匹配输入字符串的结尾位置。
复制代码
# -*- coding:utf-8 -*-

'''
by yizhiamumu
20171101
'''

import  re


'''1介绍^ . * $的用法
^ 匹配输入字符串开始的位置。
. 匹配除换行符 \n 之外的任何单字符。
* 匹配前面的子表达式零次或多次。
$ 匹配输入字符串的结尾位置。
'''

#需要匹配的字符串
line = "hello world"

#1.打印 以h 开头的文字

regex_str = '^h'
if re.match(regex_str, line):
    print "1, 打印以h 开头的文字"

#2.打印 以h 开头,后面跟着一个字符串
regex_str = '^h.'
if re.match(regex_str, line):
    print  "2, 打印以h 开头,后面跟着一个字符串"

#3.打印以h 开头,跟任意数量字符串
regex_str = '^h*'
if re.match(regex_str, line):
    print  "3打印以h 开头,后面任意数量的字符串"

#4以d 结尾
regex_str = '.*d$'
if re.match(regex_str, line):
    print "4 匹配以d 结尾的字符串"

#5 以h 开头,以d 结尾,中间只有任意一个字符串
regex_str = '^h.d$'
if re.match(regex_str, line):
    print  "5 以h 开头, 以d 结尾,中间只有任意一个字符串"

#6 以h 开头, 以d 结尾,中间任意字符串
regex_str = '^h.*d$'
if re.match(regex_str, line):
    print "6 h开头,以d 结尾,中间任意一个字符串"
复制代码

 

打印日志:

image

2、介绍() ?用法

  • ()标记一个子表达式的开始和结束位置。
  • ?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。
复制代码
'''2介绍() ?用法
()标记一个子表达式的开始和结束位置。
?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。
'''

line = "hellohailhelloworld"

#获取hail

regex_str = '.*(h.*h).*'
match_obj = re.match(regex_str, line)
if match_obj:
    print "获取hail,打印结果为hailh"
    print match_obj.group(1)

#使用非贪婪限定符,强制从左开始匹配
regex_str = '.*?(h.*h).*'
match_obj = re.match(regex_str, line)
if match_obj:
    print "使用非贪婪限定符,强制从左开始匹配"
    print match_obj.group(1)

#使用非贪婪限定符,强制从左开始匹配,遇到第一个h 就停止匹配
regex_str = '.*?(h.*?h).*'
match_obj = re.match(regex_str, line)
if match_obj:
    print "使用非贪婪限定符,强制从左开始匹配,遇到第一个h 就停止匹配"
    print  match_obj.group(1)
复制代码

 

打印日志:

image

3、介绍+ {n} {n,} {n,m}用法

  • 1)+匹配前面的子表达式一次或多次。

例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。

  • 2){n} n 是一个非负整数。匹配确定的 n 次。

例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。

  • 3){n,} n 是一个非负整数。至少匹配n 次。

例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。

  • 4){n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

复制代码
'''
3、介绍+ {n} {n,} {n,m}用法
1)+匹配前面的子表达式一次或多次。
例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
2){n} n 是一个非负整数。匹配确定的 n 次。
例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
3){n,} n 是一个非负整数。至少匹配n 次。
例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
4){n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。
例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

'''

line = "hellohailhihello world"

#获取h 和 h 之间包含特定数量字符的子字符串
#使用+, h和h 之间至少要有一个字符

regex_str = '.*(h.+h).*'
match_obj = re.match(regex_str, line)
if match_obj:
    print "使用+,获取h 和 h 之间包含特定数量字符的子字符串,h 和 h 之间至少有一个字符"
    print match_obj.group(1)

#使用{1}, h和h 之间至少有一个字符

regex_str = '.*(h.{1}h).*'
match_obj = re.match(regex_str, line)
if match_obj:
    print "使用{1}, h和h 之间至少有一个字符"
    print  match_obj.group(1)

#使用{2,} ,h 和 h 之间至少有两个字符
regex_str = '.*(h.{2,}h).*'
match_obj = re.match(regex_str, line)
if match_obj:
    print "使用{2,} ,h 和 h 之间至少有两个字符"
    print  match_obj.group(1)

# 使用{3,5} , h 和 h  之间的字符限定在3-5个
regex_str = '.*(h.{3,5}h).*'
match_obj = re.match(regex_str, line)
if match_obj:
    print "使用{3,5} , h 和 h  之间的字符限定在3-5个"
    print  match_obj.group(1)
复制代码

 

打印日志:

image

4、介绍|[123] [0-9] [^1]用法

  • 1)|指明两项之间的一个选择。
  • 2)[123] 只要是123中的其中一个即可。
  • 3)[0-9] 只要是0-9中的任意数字即可。
  • 4)[^1] 非,只要不是1即可。
复制代码
'''
4、介绍|[123] [0-9] [^1]用法

1)|指明两项之间的一个选择。
2)[123] 只要是123中的其中一个即可。
3)[0-9] 只要是0-9中的任意数字即可。
4)[^1] 非,只要不是1即可。

'''
line = "hello world"
#  \ 匹配hello world
regex_str = '(hello world|hi world)'
match_obj = re.match(regex_str, line)
if match_obj:
    print "123"
    print match_obj.group(1)
# 使用[] 匹配手机号, 1之后只要是3578 中的一个即可,后面0-9 中的数字出现9次
line = '18662342234'
regex_str = '1[3578][0-9]{9}'
match_obj = re.match(regex_str, line)
if match_obj:
    print "正确的手机号"


# 使用[]匹配手机号, 1之后只要是3578 中的一个即可,后面数字不能为1
regex_str = '1[3578][^1]{9}'
match_obj = re.match(regex_str, line)
if match_obj:
    print "使用[]匹配手机号, 1之后只要是3578 中的一个即可,后面数字不能为1"
复制代码

 

打印日志:

image

5、介绍\s \S \w \W \d用法

  • 1)\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
  • 2)\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
  • 3)\w 等价于[A-Za-z0-9_]。
  • 4)\W 与\w相反。
  • 5)\d 所有数字,等价于[0-9]。
复制代码
'''
5、介绍\s \S \w \W \d用法

1)\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
2)\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
3)\w 等价于[A-Za-z0-9_]。
4)\W 与\w相反。
5)\d 所有数字,等价于[0-9]。

'''
line = 'hello world'
regex_str = '(hello\sworld)'
match_obj = re.match(regex_str, line)
if match_obj:
    print "hello world 之间有空格"

regex_str2 = '(hello\Sworld)'
match_obj = re.match(regex_str2, line)
if match_obj:
    print "不是空格"

regex_str3 = '(hello\wworld)'
match_obj = re.match(regex_str3, line)
if match_obj:
    print "hello world 之间有[A-Za-z0-9_]其中的字符"

regex_str4 = '(hello\Wworld)'
match_obj = re.match(regex_str4, line)
if match_obj:
    print "hello world 之间不是[A-Za-z0-9_]其中的字符"

line = 'hello world 007'
regex_str5 = '.*?(\d+)'
match_obj = re.match(regex_str5, line)
if match_obj:
    print "打印其中数字"
    print match_obj.group(1)
复制代码

 

打印日志:

image

over

posted on   一只阿木木  阅读(1179)  评论(0编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek “源神”启动!「GitHub 热点速览」
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示