本文主要是介绍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
多么痛的领悟!
python学习道路(day4note)(函数,形参实参位置参数匿名参数,匿名函数,高阶函数,镶嵌函数)
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,findall、compile、特殊字符转义
本文内容: 正则表达式常用字符. 常用可选标志位. group与groups. match. search. sub. split findall. compile 特殊字符转义 一些现实例子 首发时 ...
python五十六课——正则表达式(常用函数之match)
函数:match(regex,string,[flags=0])参数:regex:就是正则表达式(定义了一套验证规则)string:需要被验证的字符串数据flags:模式/标志位,默认情况下(不定义) ...
$python正则表达式系列(2)——re模块常用函数
本文主要介绍正则re模块的常用函数. 1. 编译正则 import re p = re.compile(r'ab*') print '[Output]' print type(p) print p p ...
[ Python - 12 ] 线程的信号量、标志位及队列
线程的信号量 线程的信号量是同时允许一定数量的线程更改数据,主要作用在于限制线程的并发. #!_*_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.NET MVC5+EF6+EasyUI 后台管理系统(65)-MVC WebApi 用户验证 (1)
系列目录 前言: 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&;&;北京网赛09 Countries(优先队列)
题目链接: 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人
北京的互联网人,是工作日完全没有个人生活的一类人,也是整个北漂大队伍中,下班时间最晚的那一波人,如果赶上周末还要加班,那毫不夸张地说,你的整个人生都在互联网上奋斗着. 虽说十点上班让多少行内外的人羡慕 ...
这篇关于python标志位截取,Python正则表达式 re.sub()函数:标志位flags与参数个数问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!