这两天在写爬虫程序,涉及英文文本处理,需要规范化英文标点符号的写法。正常情况下,英文句号.后面需要保证有且只有一个空格,但也有例外情况,比如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与参数个数问题相关推荐

  1. 第11.3节 Python正则表达式搜索支持函数search、match、fullmatch、findall、finditer

    一. 概述 re模块的函数search.match.fullmatch.findall.finditer都是用于搜索文本中是否包含指定模式的串,函数的参数都是一样的,第一个参数是模式串.第二个是搜索文 ...

  2. O_RDWR, O_CREAT等open函数标志位在哪里定义?

    查了下O_RDWR, O_CREAT等定义,终于找到了. 我的系统是Fedora12, 其定义在文件:/usr/include/asm-generic/fcntl.h,部分定义如下: #include ...

  3. o_rdonly_O_RDWR, O_CREAT等open函数标志位在哪里定义? | 学步园

    查了下O_RDWR, O_CREAT等定义,终于找到了. 我的系统是Fedora12, 其定义在文件:/usr/include/asm-generic/fcntl.h,部分定义如下: #include ...

  4. Python中动态编译函数compile(source, filename, mode, ......)参数filename的作用是什么?...

    动态编译函数compile调用语法如下: compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1) 其中的fi ...

  5. Python - zip和izip函数 以及 位置参数和命名参数的运用

    zip:将两个相同长度的集合合并成对 izip: 作用跟zip一样,但面对两个超大的列表时,izip速度更快 #注意两个集合的长度大小必须一致,如果不满足,则输出结果会削减以匹配较小的集合大小 a = ...

  6. TCP Flags标志位介绍

          传输控制协议(Transmission Control Protocol,TCP)是一种传输层协议.TCP使数据包从源到目的地的传输更加顺畅.它是一种面向连接的端到端协议.每个数据包由TC ...

  7. 【Python基础】Python正则表达式,从入门到实战,精华都在这里!

    出品:Python数据之道(ID:PyDataLab) 作者:Peter,来自读者投稿 编辑:Lemon 玩转正则表达式 本文中介绍的是主要是 3 个知识点: 正则表达式的相关知识 Python的中 ...

  8. 菜鸟python 正则表达式_python基础知识(进阶篇--正则表达式)

    含义:检查一个字符串是否与某种模式匹配,由re模块提供. re.match() re.match(匹配的正则表达式,要匹配的字符串,标志位) //尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹 ...

  9. python 正则表达式 re.search() 的使用

    1 re.search() 的作用: re.search会匹配整个字符串,并返回第一个成功的匹配.如果匹配失败,则返回None 从源码里面可以看到re.search()方法里面有3个参数 patter ...

最新文章

  1. 主从配置_MySQL主从复制配置详解
  2. 《基于张量网络的机器学习入门》学习笔记1
  3. 雷军博客1999:互联网创业的黄金年代,2009年移动互联网黄金年,太准了
  4. java递归基础掉用_Java递归基础
  5. oracle insert into as select,比较create table as select * 与 insert into table select *
  6. Hibernate异常之关键字错误
  7. 在eclipse下使用java调用weka
  8. ubuntu 18.04使用aqt安装QT5.12
  9. 玩转CAD格式,CAD转PDF,CAD转DWF,只需四个步骤高效完成
  10. SuperMap iDesktop入门实战-张杰-专题视频课程
  11. 警惕,最新SCI/SSCI期刊14本期刊被剔除?
  12. PIC单片机应用开发实践教程(四): MPLAB X IDE Debug
  13. 微信可以修改微信号了
  14. android 向上飘的字符,Android如何自定义View实现抖音飘动红心效果
  15. 【初级篇】网页引入live2d
  16. Git 学习(篇六 --储藏与清理)
  17. B,BL指令的使用范围
  18. 易编远航程序防封防检测方法
  19. 计算机考试用到的英语词汇,BEC商务英语_计算机英语高级词汇·软件篇_沪江英语...
  20. 开机一直黑屏后,扣电池,No bootable device or remote image found

热门文章

  1. 编译时MSIL注入--实践Mono Cecil(1)
  2. phoenix 开发API系列 目录
  3. JavaScript的标签
  4. 如何设计Kafka?
  5. tftp 在线更新 cisco switch IOS
  6. 本地化中文示例代码需求调查
  7. 【转】Python 简介
  8. 删除前导0后缀0的几种方法
  9. ABAP 对字符串公式进行计算
  10. SAP 年结(转载)