正则表达式re.sub()常见问题及解决(换行匹配+标签清洗)

首先大家都知道re.sub()简单用法:

#re.sub()会替换满足条件的所有式子,返回被替换后的文本

text = "阅读量 9999, 点赞量 7788"
ret_sub = re.sub(r'\d+', '8800', text)

结果:
阅读量 8800, 点赞量 8800

 

 

但是有陷阱:这个例子之所以匹配全部成功是因为它所检查的是'\d',也就是数字格式,遇到不是数字的就停止了

现在做另一个例子,我们找了一个网页准备爬它的数据:

 

 

 

今天这个例子先直接复制下来,可以看到数据很乱,嵌套着很多标签,我们接下来要清洗这些数据,那就是把这些标签去掉,只留文字,在说sub方法之前还有一个问题:我第一次粘贴文本给test赋值时,代码为:

text = "<div class="job-detail"><p>1.通过爬虫技术,实现PMS系统与多个销售平台(airbnb、途家、美团榛果等)的订单房态同步、自动发房、价格调整工作;</p>
<p>工作职责:</p><p>2.完成智能定价所需要的数据爬取及数据分析等工作;</p>
<p>3.完成IM针对房源咨询的自动回复的开发工作。</p>
<p><br></p>
<p>任职资格:</p>
<p>1、Python基础良好,2-4年相关岗位工作经验;</p>
<p>2、大学全日本制本科及以上学历;</p>
<p>3、掌握网络爬虫基本类库使用,了解爬虫架构且熟练使用至少一种爬虫框架(Scrapy、PySpider等)进行开发,了解反爬虫、反反爬机制;</p>
<p>4、熟悉WebDriver、Selenium、PhantomJS等常用工具;</p>
<p>5、具有一定前端基础,拥有分析结构化和非结构化数据能力;</p>
<p>6、掌握正则表达式、搜索策略、算法、数据聚类以及重组并可以独立完成对抓取数据进行信息提取、去重和清洗;</p>
<p>7、熟练使用<a class="jd-ad" href="https://kaiwu.lagou.com/course/courseInfo.htm?courseId=1&amp;sid=3-MySQL-1557236458934" target="_blank" rel="nofollow" data-ad="3" data-lg-tj-id="1kcw" data-lg-tj-no="idnull" data-lg-tj-cid="31557236458934" data-lg-tj-content="MySQL">MySQL</a><a class="jd-ad" href="https://kaiwu.lagou.com/course/courseInfo.htm?courseId=1&amp;sid=3-%E6%95%B0%E6%8D%AE%E5%BA%93-1557236458934" target="_blank" rel="nofollow" data-ad="3" data-lg-tj-id="1kcw" data-lg-tj-no="idnull" data-lg-tj-cid="31557236458934" data-lg-tj-content="数据库">数据库</a>,了解非关系型数据库(<a class="jd-ad" href="https://kaiwu.lagou.com/course/courseInfo.htm?courseId=1&amp;sid=3-Redis-1557236458934" target="_blank" rel="nofollow" data-ad="3" data-lg-tj-id="1kcw" data-lg-tj-no="idnull" data-lg-tj-cid="31557236458934" data-lg-tj-content="Redis">Redis</a>、MongoDB等);</p>
<p>8、了解Scrapy+Redis<a class="jd-ad" href="https://kaiwu.lagou.com/course/courseInfo.htm?courseId=1&amp;sid=3-%E5%88%86%E5%B8%83%E5%BC%8F-1557236458934" target="_blank" rel="nofollow" data-ad="3" data-lg-tj-id="1kcw" data-lg-tj-no="idnull" data-lg-tj-cid="31557236458934" data-lg-tj-content="分布式">分布式</a>策略为加分项。</p>
</div>"

结果疯狂报错,我????怎么粘贴个文本还有错了,百度无果,突然想到引号匹配的问题:test字符串用双引号包裹,div标签里也有双引号,直接配对,导致错误,解决方法就是要么把文本里的双引号转义,要么改外面包裹的双引号,标签很多,可想有多麻烦,直接把外层双引号改为三引号,问题解决!接下来说正题:

要去掉标签,可以想到那就用re.sub()方法,用空字符串去替代每个标签,初始想法:

text = re.sub(r'<.*>', "", text)

这样做了之后可以发现结果是全空,接下来又加了

text = re.sub(r"^<.*>", "", text)

发现结果是只过滤掉了第一个标签,接下来的数据全没有动,百度了一下,发现原来是换行出了问题,匹配到第一个<h后,‘.’对'\n'没辙,所以就直接停止了。得,先解决换行问题:

text = re.sub(r'\n+', '', text)

接下来的数据就没有换行了,但是结果还不正确,又出现了全空,百度了也没有结果,突然想到以前做爬虫常用的正则是:*后面跟?,继续百度,找到了问题所在:

.*具有贪婪的性质,首先匹配到不能匹配为止,根据后面的正则表达式,会进行回溯。.*?则相反,一个匹配以后,就往下进行,所以不会进行回溯,具有最小匹配的性质。

我们虽然没有换行符了,但是.*条件一直满足,一直贪婪下去,则一直匹配到了末尾 ,而?则成为非贪婪,匹配到了一个就停止继续下一个匹配。那么改了之后的代码:

text = '''<div class="job-detail"><p>1.通过爬虫技术,实现PMS系统与多个销售平台(airbnb、途家、美团榛果等)的订单房态同步、自动发房、价格调整工作;</p>
<p>工作职责:</p><p>2.完成智能定价所需要的数据爬取及数据分析等工作;</p>
<p>3.完成IM针对房源咨询的自动回复的开发工作。</p>
<p><br></p>
<p>任职资格:</p>
<p>1、Python基础良好,2-4年相关岗位工作经验;</p>
<p>2、大学全日本制本科及以上学历;</p>
<p>3、掌握网络爬虫基本类库使用,了解爬虫架构且熟练使用至少一种爬虫框架(Scrapy、PySpider等)进行开发,了解反爬虫、反反爬机制;</p>
<p>4、熟悉WebDriver、Selenium、PhantomJS等常用工具;</p>
<p>5、具有一定前端基础,拥有分析结构化和非结构化数据能力;</p>
<p>6、掌握正则表达式、搜索策略、算法、数据聚类以及重组并可以独立完成对抓取数据进行信息提取、去重和清洗;</p>
<p>7、熟练使用<a class="jd-ad" href="https://kaiwu.lagou.com/course/courseInfo.htm?courseId=1&amp;sid=3-MySQL-1557236458934" target="_blank" rel="nofollow" data-ad="3" data-lg-tj-id="1kcw" data-lg-tj-no="idnull" data-lg-tj-cid="31557236458934" data-lg-tj-content="MySQL">MySQL</a><a class="jd-ad" href="https://kaiwu.lagou.com/course/courseInfo.htm?courseId=1&amp;sid=3-%E6%95%B0%E6%8D%AE%E5%BA%93-1557236458934" target="_blank" rel="nofollow" data-ad="3" data-lg-tj-id="1kcw" data-lg-tj-no="idnull" data-lg-tj-cid="31557236458934" data-lg-tj-content="数据库">数据库</a>,了解非关系型数据库(<a class="jd-ad" href="https://kaiwu.lagou.com/course/courseInfo.htm?courseId=1&amp;sid=3-Redis-1557236458934" target="_blank" rel="nofollow" data-ad="3" data-lg-tj-id="1kcw" data-lg-tj-no="idnull" data-lg-tj-cid="31557236458934" data-lg-tj-content="Redis">Redis</a>、MongoDB等);</p>
<p>8、了解Scrapy+Redis<a class="jd-ad" href="https://kaiwu.lagou.com/course/courseInfo.htm?courseId=1&amp;sid=3-%E5%88%86%E5%B8%83%E5%BC%8F-1557236458934" target="_blank" rel="nofollow" data-ad="3" data-lg-tj-id="1kcw" data-lg-tj-no="idnull" data-lg-tj-cid="31557236458934" data-lg-tj-content="分布式">分布式</a>策略为加分项。</p>
</div>'''

text = re.sub(r'\n+', '', text)
print(text + '\n')
ret = re.sub(r"<.*?>", "", text)
print(ret)

运行结果:

问题解决!赏心悦目! 

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: MySQL 8.0.31 兼容的 JDBC 驱动 Jar 包是 MySQL Connector/J 8.0.31。它是 MySQL 官方提供的 Java 驱动程序,用于连接和操作 MySQL 数据库。您可以从官方网站 https://dev.mysql.com/downloads/connector/j/ 下载该驱动程序。您需要下载适用于 Java 8 或更高版本的版本,以便正常运行。此外,如果您使用 Maven 或 Gradle 等构建工具来管理项目依赖项,您还可以通过查找官方文档来获取相应的依赖代码。使用该驱动程序时,请确保将其添加到您的应用程序 classpath 中,以便正确加载。您可以使用以下代码测试您是否成功获得了 MySQL Connector/J 驱动程序: ```java try { Class.forName("com.mysql.cj.jdbc.Driver"); System.out.println("MySQL JDBC 驱动已加载"); } catch (ClassNotFoundException e) { System.err.println("无法加载 MySQL JDBC 驱动"); e.printStackTrace(); } ``` 如果您看到 "MySQL JDBC 驱动已加载",则说明您成功安装并配置了 MySQL Connector/J 驱动程序。现在,您可以开始在 Java 应用程序中使用 MySQL 数据库了。 ### 回答2: 与mysql8.0.31兼容的jdbc驱动jar包是mysql-connector-java-8.0.31.jar。 JDBC是Java语言中访问数据库的标准API,mysql-connector-java-8.0.31.jar是 MySQL官方提供的 JDBC 驱动程序包,适用于 Java 8、Java 7、MySQL 8.0、MySQL 5.7、MySQL 5.6、MySQL 5.5 和 MySQL 5.1 。 下载mysql-connector-java-8.0.31.jar后,可以通过以下步骤将其添加到Java的classpath中: 1. 在项目中新建lib文件夹,将mysql-connector-java-8.0.31.jar文件复制到该文件夹中。 2. 在项目的classpath中添加对mysql-connector-java-8.0.31.jar的引用。 3. 在代码中加载JDBC驱动程序,例如: ``` Class.forName("com.mysql.cj.jdbc.Driver"); ``` 4. 使用连接字符串连接到MySQL数据库,例如: ``` String url = "jdbc:mysql://localhost:3306/mydatabase?serverTimezone=UTC"; String user = "username"; String password = "password"; Connection conn = DriverManager.getConnection(url, user, password); ``` 5. 开始执行SQL操作,例如: ``` Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM mytable"); while (rs.next()) { // 处理结果集 } ``` ### 回答3: 针对MySQL 8.0.31版本,可以使用以下JDBC驱动jar包: 1. MySQL Connector/J 8.0.31:这是官方的MySQL JDBC驱动程序,版本与MySQL 8.0.31兼容。可以从https://dev.mysql.com/downloads/connector/j/网站下载。 2. MariaDB Connector/J 2.7.4:这是MariaDB JDBC驱动程序,可以与MySQL兼容。在此版本中,与MySQL 8.0.31进行了完整测试,可以从https://mariadb.com/downloads/mariadb-connector-j/网站下载。 以上两个驱动都具有完整的功能,可以让您在Java应用程序中连接MySQL 8.0.31数据库。建议使用MySQL官方提供的驱动程序,因为它能够更好地支持MySQL 8.0.31特定的特性和功能。 此外,需要注意的是,导入JDBC驱动器是连接MySQL数据库的先决条件。在编写代码之前,请确保您正确配置了数据库连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值