Python正则表达式 re.sub()函数:标志位flags与参数个数问题
这两天在写爬虫程序,涉及英文文本处理,需要规范化英文标点符号的写法。正常情况下,英文句号.
后面需要保证有且只有一个空格,但也有例外情况,比如i.e.
、e.g.
、P.S.
这种。由于无法预测大小写,因此在正则表达式中使用了标志位
flags,却死活不生效。
一开始,我的函数是这样写的:
def punctuate(s):#----其余代码暂略s = re.sub(' e. g. ', 'e.g.', s, re.I)return s
代码的本意是:本来好好的e.g.
,被函数前半断的代码错改成e. g.
之后,需要修复一下,将英文句号.
后面的空格删掉。但这行 re.sub() 代码主要有2个问题:
e. g.
前后不一定是空格,因此这样写的话,如果遇到e. g.,
或是(e. g. xxx
的情况就会被跳过。- 英文的句号
.
未转义 - 标志位
re.I
不生效
前2个问题好解决。改进代码如下:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''def punctuate(s):#----其余代码暂略s = re.sub('([^a-zA-Z]e\.) (g\.[^a-zA-Z])', '\g<1>\g<2>', s, re.I)return s
规则是:e. g.
之前或之后,必须有非英文字母的字符(包括空格),且e.
和g.
中间有一个空格,则将中间的空格删掉,且保留前后的非英文字母(\g<1>
表示查找到的第1个括号内的文本,\g<2>
表示第2个括号)。但标志位 re.I 的问题还是没解决。
re.sub(pattern, repl, string, count=0, flags=0)
我传入的第4个参数 re.I 会被当作是 count。因此,正确的姿势是明确写明flags=re.I
。
整个标点符号规范化函数还包括其它的替换,完整代码如下:
def punctuate(s):s = re.sub('([,:;?!\.”\)])', '\g<1> ', s) #后加空格s = re.sub('([“\(])', ' \g<1>', s) #前加空格s = re.sub('([“\(]) ', '\g<1>', s) #后删空格s = re.sub(' ([,:;?!\.”\)])', '\g<1>', s) #前删空格s = re.sub('([,\.?!;\)]) ”', '\g<1>”', s) #闭引号前去空格s = re.sub('\) ([,:;?!\.”])', ')\g<1>', s) #闭括号后去空格s = re.sub('(\d)\. (\d)', '\g<1>.\g<2>', s) #小数点后去空格s = re.sub(' +', ' ', s) #多空格改单空格#拉丁加点缩写单词,点号后面去空格s = re.sub('([^a-zA-Z]e\.) (g\.[^a-zA-Z])', '\g<1>\g<2>', s, flags=re.I)s = re.sub('([^a-zA-Z]i\.) (e\.[^a-zA-Z])', '\g<1>\g<2>', s, flags=re.I)s = re.sub('([^a-zA-Z]q\.) (v\.[^a-zA-Z])', '\g<1>\g<2>', s, flags=re.I)s = re.sub('([^a-zA-Z]v\.) (s\.[^a-zA-Z])', '\g<1>\g<2>', s, flags=re.I)s = re.sub('([^a-zA-Z]n\.) (b\.[^a-zA-Z])', '\g<1>\g<2>', s, flags=re.I)s = re.sub('([^a-zA-Z]p\.) (s\.[^a-zA-Z])', '\g<1>\g<2>', s, flags=re.I)s = re.sub('\. ,', '.,', s)return s
Python正则表达式 re.sub()函数:标志位flags与参数个数问题相关推荐
- 第11.3节 Python正则表达式搜索支持函数search、match、fullmatch、findall、finditer
一. 概述 re模块的函数search.match.fullmatch.findall.finditer都是用于搜索文本中是否包含指定模式的串,函数的参数都是一样的,第一个参数是模式串.第二个是搜索文 ...
- O_RDWR, O_CREAT等open函数标志位在哪里定义?
查了下O_RDWR, O_CREAT等定义,终于找到了. 我的系统是Fedora12, 其定义在文件:/usr/include/asm-generic/fcntl.h,部分定义如下: #include ...
- o_rdonly_O_RDWR, O_CREAT等open函数标志位在哪里定义? | 学步园
查了下O_RDWR, O_CREAT等定义,终于找到了. 我的系统是Fedora12, 其定义在文件:/usr/include/asm-generic/fcntl.h,部分定义如下: #include ...
- Python中动态编译函数compile(source, filename, mode, ......)参数filename的作用是什么?...
动态编译函数compile调用语法如下: compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1) 其中的fi ...
- Python - zip和izip函数 以及 位置参数和命名参数的运用
zip:将两个相同长度的集合合并成对 izip: 作用跟zip一样,但面对两个超大的列表时,izip速度更快 #注意两个集合的长度大小必须一致,如果不满足,则输出结果会削减以匹配较小的集合大小 a = ...
- TCP Flags标志位介绍
传输控制协议(Transmission Control Protocol,TCP)是一种传输层协议.TCP使数据包从源到目的地的传输更加顺畅.它是一种面向连接的端到端协议.每个数据包由TC ...
- 【Python基础】Python正则表达式,从入门到实战,精华都在这里!
出品:Python数据之道(ID:PyDataLab) 作者:Peter,来自读者投稿 编辑:Lemon 玩转正则表达式 本文中介绍的是主要是 3 个知识点: 正则表达式的相关知识 Python的中 ...
- 菜鸟python 正则表达式_python基础知识(进阶篇--正则表达式)
含义:检查一个字符串是否与某种模式匹配,由re模块提供. re.match() re.match(匹配的正则表达式,要匹配的字符串,标志位) //尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹 ...
- python 正则表达式 re.search() 的使用
1 re.search() 的作用: re.search会匹配整个字符串,并返回第一个成功的匹配.如果匹配失败,则返回None 从源码里面可以看到re.search()方法里面有3个参数 patter ...
最新文章
- 主从配置_MySQL主从复制配置详解
- 《基于张量网络的机器学习入门》学习笔记1
- 雷军博客1999:互联网创业的黄金年代,2009年移动互联网黄金年,太准了
- java递归基础掉用_Java递归基础
- oracle insert into as select,比较create table as select * 与 insert into table select *
- Hibernate异常之关键字错误
- 在eclipse下使用java调用weka
- ubuntu 18.04使用aqt安装QT5.12
- 玩转CAD格式,CAD转PDF,CAD转DWF,只需四个步骤高效完成
- SuperMap iDesktop入门实战-张杰-专题视频课程
- 警惕,最新SCI/SSCI期刊14本期刊被剔除?
- PIC单片机应用开发实践教程(四): MPLAB X IDE Debug
- 微信可以修改微信号了
- android 向上飘的字符,Android如何自定义View实现抖音飘动红心效果
- 【初级篇】网页引入live2d
- Git 学习(篇六 --储藏与清理)
- B,BL指令的使用范围
- 易编远航程序防封防检测方法
- 计算机考试用到的英语词汇,BEC商务英语_计算机英语高级词汇·软件篇_沪江英语...
- 开机一直黑屏后,扣电池,No bootable device or remote image found