python标志位截取,Python正则表达式 re.sub()函数:标志位flags与参数个数问题

这两天在写爬虫程序,涉及英文文本处理,需要规范化英文标点符号的写法。正常情况下,英文句号「.」后面需要保证有且只有一个空格,但也有例外情况,比如「i.e.」、「e.g.」、「P.S.」这种。由于无法预测大小写,因此在正则表达式中使用了「标志位」flags,却死活不生效。

一开始,我的函数是这样写的:

1 def punctuate(s):

2 #----其余代码暂略

3 s = re.sub(' e. g. ', 'e.g.', s, re.I)

4 return s

代码的本意是:本来好好的「e.g.」,被函数前半断的代码错改成「e. g. 」之后,需要修复一下,将英文句号「.」后面的空格删掉。但这行 re.sub() 代码主要有2个问题:

「e. g.」前后不一定是空格,因此这样写的话,如果遇到「e. g.,」或是「(e. g. xxx」的情况就会被跳过。

英文的句号「.」未转义

标志位 re.I 不生效

前2个问题好解决。改进代码如下:

1 def punctuate(s):

2 #----其余代码暂略

3 s = re.sub('([^a-zA-Z]e\.) (g\.[^a-zA-Z])', '\g<1>\g<2>', s, re.I)

4 return s

规则是:「e. g.」之前或之后,必须有「非英文字母」的字符(包括空格),且「e.」和「g.」中间有一个空格,则将中间的空格删掉,且保留前后的「非英文字母」(\g<1>表示查找到的第1个括号内的文本,\g<2>表示第2个括号)。但标志位 re.I 的问题还是没解决。

后来翻到了「Python--详解Python中re.sub」这篇文章,才顿悟:re.sub() 函数有5个参数,我传入了4个参数,最后一个被认为是第4个参数,而不是第5个!多么低级的错误啊!

re.sub(pattern, repl, string, count=0, flags=0)

我传入的第4个参数 re.I 会被当作是 count。因此,正确的姿势是明确写明「flags=re.I」。

整个标点符号规范化函数还包括其它的替换,完整代码如下:

1 def punctuate(s):

2 s = re.sub('([,:;?!\.”\)])', '\g<1> ', s) #后加空格

3 s = re.sub('([“\(])', ' \g<1>', s) #前加空格

4 s = re.sub('([“\(]) ', '\g<1>', s) #后删空格

5 s = re.sub(' ([,:;?!\.”\)])', '\g<1>', s) #前删空格

6 s = re.sub('([,\.?!;\)]) ”', '\g<1>”', s) #闭引号前去空格

7 s = re.sub('\) ([,:;?!\.”])', ')\g<1>', s) #闭括号后去空格

8 s = re.sub('(\d)\. (\d)', '\g<1>.\g<2>', s) #小数点后去空格

9 s = re.sub(' +', ' ', s) #多空格改单空格

10 #拉丁加点缩写单词,点号后面去空格

11 s = re.sub('([^a-zA-Z]e\.) (g\.[^a-zA-Z])', '\g<1>\g<2>', s, flags=re.I)

12 s = re.sub('([^a-zA-Z]i\.) (e\.[^a-zA-Z])', '\g<1>\g<2>', s, flags=re.I)

13 s = re.sub('([^a-zA-Z]q\.) (v\.[^a-zA-Z])', '\g<1>\g<2>', s, flags=re.I)

14 s = re.sub('([^a-zA-Z]v\.) (s\.[^a-zA-Z])', '\g<1>\g<2>', s, flags=re.I)

15 s = re.sub('([^a-zA-Z]n\.) (b\.[^a-zA-Z])', '\g<1>\g<2>', s, flags=re.I)

16 s = re.sub('([^a-zA-Z]p\.) (s\.[^a-zA-Z])', '\g<1>\g<2>', s, flags=re.I)

17 s = re.sub('\. ,', '.,', s)

18 return s

819a8475756a55697bdf4fd3754782da.png

多么痛的领悟!

python学习道路&lpar;day4note&rpar;&lpar;函数&comma;形参实参位置参数匿名参数,匿名函数,高阶函数,镶嵌函数&rpar;

1.函数 2种编程方法 关键词面向对象:华山派 --->> 类----->class面向过程:少林派 -->> 过程--->def 函数式编程:逍遥派 --> ...

python中,print函数的sep和end参数

print函数是我们经常使用的,但是它的sep和end参数或许对很多python使用者相对陌生,他们可以让我们的打印更具有个性化. 先来看下官方解释, sep:分割值与值,默认是一个空格 end:附件 ...

简介Python正则表达式

一.概念 简单来说正则表达式是由一些普通字符(例如,a 到 z 之间的字母)和一些元字符组成,用来匹配和过滤一些字符串的一种逻辑公式. 二.正则表达式的一些基本规则 1.一些常用的元字符   ^  : ...

python正则表达式模块re:正则表达式常用字符、常用可选标志位、group与groups、match、search、sub、split&comma;findall、compile、特殊字符转义

本文内容: 正则表达式常用字符. 常用可选标志位. group与groups. match. search. sub. split findall. compile 特殊字符转义 一些现实例子 首发时 ...

python五十六课——正则表达式(常用函数之match)

函数:match(regex,string,[flags=0])参数:regex:就是正则表达式(定义了一套验证规则)string:需要被验证的字符串数据flags:模式/标志位,默认情况下(不定义) ...

&dollar;python正则表达式系列(2)——re模块常用函数

本文主要介绍正则re模块的常用函数. 1. 编译正则 import re p = re.compile(r'ab*') print '[Output]' print type(p) print p p ...

&lbrack; Python - 12 &rsqb; 线程的信号量、标志位及队列

线程的信号量 线程的信号量是同时允许一定数量的线程更改数据,主要作用在于限制线程的并发. #!_*_coding:utf-8_*_ # Author: hkey import threading, t ...

关于Python正则表达式findall函数问题详解

关于Python正则表达式 findall函数问题详解 在写正则表达式的时候总会遇到不少的问题, 特别是在表达式有多个元组的时候.下面看下re模块下的findall()函数和多个表达式元组相遇的时候会 ...

Python 正则表达式之 sub 和 subn函数的使用

re.sub() 函数的功能 re是reguler expressioin的缩写,表示正则表达式 sub 是 substitute 的缩写,表示替换: re.sub是个正则表达式方面的函数,用来实现通 ...

随机推荐

ASP&period;NET MVC5&plus;EF6&plus;EasyUI 后台管理系统(65)-MVC WebApi 用户验证 &lpar;1&rpar;

系列目录 前言: WebAPI主要开放数据给手机APP,其他需要得知数据的系统,或者软件应用,所以移动端与系统的数据源往往是相通的. Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能, ...

记录在linux下的wine生活

记录在linux下的windows生活 本篇内容涉及QQ.微信.Office的安装配置 QQ: 到deepin下载轻聊版. 如果安装了crossover,那么将其中opt/cxoffice/suppo ...

java的poi技术读取和导入Excel

项目结构: http://www.cnblogs.com/hongten/gallery/image/111987.html  用到的Excel文件: http://www.cnblogs.com/h ...

Android 学习笔记

1.sleep(),wait(),notify(),notifyAll() sleep()是线程类的静态方法,阻塞线程一定时间后再次使线程处于可以被调度运行的状态wait(),notify(),not ...

虚拟机下玩DXF

DXF检测虚拟机好象已经很长时间了,记得当时也是在网上找的教程,今天无聊又检测了一下,发现目前依然有效.用记事本打开 虚拟机启动文件 xxxx.vmx 在最后添加如下两行代码monitor_contr ...

hihocoder-1391&amp&semi;&amp&semi;北京网赛09 Countries&lpar;优先队列&rpar;

题目链接: Countries 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 There are two antagonistic countries, country ...

java语言写文件内容

import java.io.File;import java.io.FileWriter;import java.io.IOException; public static void main(St ...

tachyon 集群安装

tachyon的集群安装和单机安装差别不大 http://www.cnblogs.com/admln/p/tachyon-local-install.html 不同的地方 1.修改slaves时填入所 ...

css3动画 9步

...

北漂的IT人

北京的互联网人,是工作日完全没有个人生活的一类人,也是整个北漂大队伍中,下班时间最晚的那一波人,如果赶上周末还要加班,那毫不夸张地说,你的整个人生都在互联网上奋斗着. 虽说十点上班让多少行内外的人羡慕 ...

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值