import re 遇到的提取问题

了解更多关注微信公众号“木下学Python”吧~

 

文档:https://docs.python.org/3.6/howto/regex.html

目录

1.常见的正则字符和转义

2.爬取结构

3.re.findall('正则表达式',匹配内容,re.S(换行匹配))

4.获取标签中的url

5.compile() 和 findall() 详解

6.匹配问题:

7.正则匹配的字符串去掉中间某些部分

8.标签问题

9.re.match(pattern,string,flags=0):

10.re.search

11.有 JavaScript 的信息字样的提取

12.re.purge()

13.匹配中文

14.贪婪与非贪婪


 

1.常见的正则字符和转义

 https://www.imooc.com/article/20354

            https://blog.youkuaiyun.com/u010760374/article/details/79974586

 

2.爬取结构

 res = requests.get(url,headers = headers)


 #爬取

 names = re.findall('<a.*?>(.*?)</a>',res.text,re.S) #re.S 换行匹配

 

 

3.re.findall('正则表达式',匹配内容,re.S(换行匹配))

匹配所有符合的!

           如:

import re
line = '123 is a 321'
p = re.findall(r'[0-9]+',line)
print(p)

结果返回列表 ['123','321']

def get_info(url):
    res = requests.get(url,headers = headers)

     #判断请求码是否为200
     if res.status_code == 200:

         contents = re.findall('<p>(.*?)</p>',res.content.decode('utf-8'),re.S)
         
         for content in contents:

             f.write(content + '\n')

                匹配内容如果为网页上的字,匹配内容写成:res.content.decode('utf-8') 或 res.text;.content 获得二进制代码

 

4.获取标签中的url

            

<img width="100" alt="泰坦尼克号"  src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p457760035.webp" class="">

 获取名字:namePat = r'alt="(.*?)" src='

            获取url:imgPat = r'src="(.*?)" class='

 

5.compile() 和 findall() 详解

 https://blog.youkuaiyun.com/drdairen/article/details/51134816

#获取文章链接正则
article_url = '<div class="txt-box">.*?(http://.*?)"'
article_urls_list.append(re.compile(article_url,re.S).findall(data1))

compile() 是编译函数,把字符串编译成正则,然后用 findall()匹配源码

 

6.匹配问题:

<span class="pl">出版者:</span>&nbsp;(.*?)<br /> 对

<span class="pl">出版者:</span>&nbsp;(.*?) 错
 <span class="pl">表演者: <a href="/search?q=Jason%20Mraz&amp;sid=2995812">Jason Mraz</a>
</span>

这种标签匹配Jason Mraz,

'表演者:.*?>(.*?)</a>'

 

7.正则匹配的字符串去掉中间某些部分

 可用方法replace('去掉部分',''),用格代替

 

8.标签问题

1)网页上看到的标签是<br>,复制下来也是<br>,但就是错,说明标签是<br />或<br/>

2)标签中的内容太长可以省略:

<span class="pl">上映日期:</span><span property="v:initialReleaseDate" content="2006-06-30(中国大陆)">2006-06-30(中国大陆)</span>

<span class="pl">上映日期:.*?">(.*?)</span>

 

9.re.match(pattern,string,flags=0):

        pattern为正则表达式,string为匹配的字符串,flags 用来控制正则表达式的匹配方式,如是否区分大小写,多行匹配等,

        只能从字符串其实位置开始匹配。只能匹配一个!

        例如:

import re

line = 'zjk is a handsome boy,he like zxy.!!!'

 m = re.match(r'(.*) boy,he (.*)\.(.*)',line)

print(m.group(0))
print(m.group(1))
print(m.group(2))
print(m.group(3))
print(m.groups())

       print(m.group(0)) 为打印匹配的原字符串 line

       print(m.group(1)) 打印第一个括号返回的结果,下面两个同理

       print(m.groups()) 打印匹配结果的列表,每一组都以元组形式表

 

10.re.search

import re

line = 'zjk is a handsome boy,he like zxy.!!!'

m = re.match(r'zxy',line)
n = re.search(r'zxy',line)

print(m)
print(n)

它与 re.match 不同的是扫描整个字符串

 

11.有 JavaScript 的信息字样的提取

  • 其下的标签也要在源码中提取

<a href="javascript:void(0);" id="js_name">狗熊会</a>

要提取 ‘狗熊会’;使用如下正则会没有结果

<a href="javascript:void(0);" id="js_name">(.*?)</a>

要在网页源代码中提取,网页源代码,以及正则如下

var nickname = "狗熊会" #源代码

var nickname = "(.*?)" #正则

 

12.re.purge()

清除缓存

 

13.匹配中文

[\u4e00-\u9fa5]

 

14.贪婪与非贪婪

贪婪:尽可能匹配一个字符串里面多个符合的

非贪婪:尽可能往后匹配符合的

#非贪婪
import re
a = '1234;456789;'
b = re.findall(r'(.*);',a)
print(b)

>>>['1234;456789']
#贪婪
import re
a = '1234;456789;'
b = re.findall(r'(.*?);',a)
print(b)

>>>['1234', '456789']

 

15.静态网页正则提取

直接右键检查,复制相应的片段去匹配,老是匹配不出,可以直接去源码网站,找到对应的行,把这一行复制去匹配

 

<think>好的,我现在需要回答用户关于如何在Python中使用import re进行正则表达式操作的教程。首先,我要确保自己正确理解用户的问题。用户希望了解使用re模块进行正则表达式操作的方法,可能需要包括基本步骤、常用函数、示例以及注意事项。 首先,我应该回顾一下Python的re模块的基础知识。记得re模块提供了正则表达式的支持,包括匹配、搜索、替换等操作。需要覆盖常用的函数,比如re.search(), re.match(), re.findall(), re.sub()等。每个函数的用途和区别要解释清楚,比如match和search的区别在于match只从字符串开头开始匹配,而search会扫描整个字符串。 接下来,用户可能需要具体的例子来说明如何使用这些函数。比如,使用findall来查找所有匹配项,或者用sub进行替换操作。应该举一些实际的例子,比如匹配邮箱地址、电话号码等常见的模式。同时,需要注意正则表达式的语法,比如使用r前缀避免转义问题,分组、字符类、量词等基本元素。 然后,用户可能对正则表达式的语法不太熟悉,是否需要简单介绍一下?或者用户可能已经了解基础,所以可以重点放在re模块的使用上。根据引用内容,用户可能已经看过一些基本介绍,所以可以适当结合引用来解释,比如引用[2]提到正则表达式用特殊符号组合来描述字符规则,并提到re模块的实现方式。 另外,需要考虑用户可能遇到的常见问题,比如贪婪匹配与非贪婪匹配的区别,如何处理多行匹配,或者使用re.I等标志参数来忽略大小写。这些可以通过示例代码来展示,比如在findall中使用re.I忽略大小写,如引用[3]中的示例。 还要注意代码的正确性,确保示例中的正则表达式和Python代码语法正确。例如,用户提供的示例中有一个字符串'MR_SHOP mr_shop',在使用re.findall时,模式r'mr_\w+'加上re.I标志会匹配到两个结果,但原示例的输出可能需要注意大小写的问题,可能需要指出标志的作用。 此外,可能需要提到编译正则表达式对象的情况,即使用re.compile()来预编译模式,提高效率,尤其是在多次使用同一模式时。这属于优化的一部分,但用户的问题主要是用法教程,所以可能放在高级用法或注意事项里。 最后,应该总结一下使用re模块的步骤:导入模块、定义模式、选择合适的方法进行处理,并处理结果。同时提醒用户注意正则表达式的复杂性和调试方法,比如使用在线测试工具验证表达式。 现在,需要将这些思路组织成结构化的教程,分步骤讲解,每个步骤配以示例代码和解释,确保用户能够一步步理解和应用。同时,根据用户提供的引用内容,适当引用相关段落,比如在解释正则表达式的作用时引用[1]和[2],在示例部分引用[3]。 可能需要检查是否有遗漏的重要函数或功能,例如分组捕获、替换中的回调函数、split方法等,但根据用户的问题,可能基础用法更为重要,所以可以集中在最常用的几个函数上,避免信息过载。 最后,生成相关问题,帮助用户进一步学习,比如关于高级正则表达式语法、性能优化、常见错误处理等。</think>以下是在Python中使用`import re`进行正则表达式操作的详细教程: --- ### 一、导入正则表达式模块 在Python中,首先需导入`re`模块: ```python import re # 引用[1] ``` --- ### 二、常用函数及用法 #### 1. **匹配字符串** - **`re.match(pattern, string)`** 从字符串**开头**匹配模式,成功返回匹配对象,否则返回`None`。 ```python result = re.match(r'mr_\w+', 'mr_shop123') if result: print("匹配成功:", result.group()) # 输出:mr_shop123 ``` - **`re.search(pattern, string)`** 扫描整个字符串,返回**第一个**匹配对象。 ```python result = re.search(r'\d+', '订单号: 2023ABC') print(result.group()) # 输出:2023 ``` #### 2. **查找所有匹配项** - **`re.findall(pattern, string)`** 返回所有匹配的子串列表。 ```python matches = re.findall(r'mr_\w+', 'MR_SHOP mr_shop', flags=re.I) # 引用[3] print(matches) # 输出:['MR_SHOP', 'mr_shop'] ``` #### 3. **替换字符串** - **`re.sub(pattern, repl, string)`** 将匹配的文本替换为指定内容。 ```python new_str = re.sub(r'\d+', '***', '电话: 123456') print(new_str) # 输出:电话: *** ``` #### 4. **分割字符串** - **`re.split(pattern, string)`** 按模式分割字符串。 ```python parts = re.split(r'\W+', 'apple,banana;cherry') print(parts) # 输出:['apple', 'banana', 'cherry'] ``` --- ### 三、正则表达式语法要点 1. **基础语法** - `\d` 匹配数字,`\w` 匹配字母/数字/下划线,`.` 匹配任意字符(换行符除外)。 - `*`(0次或多次)、`+`(1次或多次)、`?`(0次或1次)表示重复次数。 - `^` 匹配开头,`$` 匹配结尾。 2. **分组与捕获** - 使用`()`定义分组,可通过`group(n)`获取: ```python result = re.search(r'(\d{4})-(\d{2})', '日期: 2023-10') print(result.group(1)) # 输出:2023 ``` 3. **标志参数** - `re.I`(忽略大小写),`re.M`(多行模式),`re.S`(使`.`匹配换行符)。 --- ### 四、完整示例 **提取所有邮箱地址**: ```python text = "联系邮箱: user@example.com, 备用邮箱: admin@test.org" emails = re.findall(r'\b[\w.-]+@[\w.-]+\.\w+\b', text) print(emails) # 输出:['user@example.com', 'admin@test.org'] ``` --- ### 五、注意事项 1. **原始字符串** 建议使用`r''`定义正则表达式,避免转义问题(如`r'\d'`等价于`'\\d'`)[^2]。 2. **贪婪与非贪婪匹配** `.*`为贪婪匹配,`.*?`为非贪婪匹配。 3. **预编译模式** 频繁使用的模式可预编译以提升性能: ```python pattern = re.compile(r'\d+') matches = pattern.findall('a1b23c456') ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值