python中用正则表达式去掉文本中所有的标点符号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中用正则表达式去掉文本中所有的标点符号相关的知识,希望对你有一定的参考价值。

目前的做法是:

line=re.sub(r'[]+'.format(punctuation),'',line)
但是这样不能够将标点符号去除完全,比如python’s中的“ ’ ”就不能被去掉,请问该怎么做?

我的理解是  python’s的“ ’ ”也是字符 ,和标点符号一样。你只要把去除的字符都加到正则表达式的括号中就可以了。 ,所以:

import re

r='[’!"#$%&\\'()*+,-./:;<=>?@[\\\\]^_`|~]+'

line=re.sub(r,'',"python’s")

print line

参考技术A

先定义变量 punctuation,其内容应该是所有的标点符号。

例如:import repunctuation def removePunctuation...

Python是一种面向对象、直译式计算机程序设计语言,由荷兰人Guido van Rossum发明于1989年,1991年发行第一个公开发行版。它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结在一起。

Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL协议。语法简洁清晰,特色之一是强制用空白符作为语句缩进。名字来源于一个喜剧,最初设计Python这种语言的人并没有想到Python会在工业和科研上获得如此广泛的使用。

参考技术B line.translate(None,punctuation)

追问

报错:
translate() takes exactly one argument (2 given)

追答

python啥版本。。line是string?


看文档https://docs.python.org/2/library/stdtypes.html#str.translate



unicode 真麻烦。。上了次stackoverflow才找到。。。



import unicodedata
import sys

tbl = dict.fromkeys(i for i in xrange(sys.maxunicode)
                      if unicodedata.category(unichr(i)).startswith('P'))
def remove_punctuation(text):
    return text.translate(tbl)
    
    
#你爽了直接 remove_punctuation(line)
#或者屌屌的这样:
import regex as re

def remove_punctuation(text):
    return re.sub(ur"\\pP+", "", text)

本回答被提问者采纳

如何在 python 中替换正则表达式?

【中文标题】如何在 python 中替换正则表达式?【英文标题】:How do I do this replace regex in python? 【发布时间】:2011-03-19 21:00:45 【问题描述】:

给定一串文本,在 Python 中:

s = "(((((hi abc )))))))"
s = "***(((((hi abc ***&&&&"

如何将出现超过 3 次的所有非字母符号替换为空白字符串

对于以上所有,结果应该是:

hi abc

【问题讨论】:

如果输入为"(&amp;*hello!@#",输出应该是什么? 【参考方案1】:

这应该有效:\W3,:匹配出现 3 次或更多次的非字母数字:

>>> s = "***(((((hi abc ***&&&&"
>>> re.sub("\W3,", "", s) 
'hi abc'
>>> s = "(((((hi abc )))))))"
>>> re.sub("\W3,", "", s) 
'hi abc'

【讨论】:

@John:正确。示例包括“***”,所以我猜测他想要 3+……我相信,鉴于这个解决方案,他可以弄清楚如何添加一个。 (这就是为什么我用斜体3个或更多【参考方案2】:

如果您想替换任何非空格非字母数字序列(例如'!?&amp;' 以及您的示例),@Stephen 的答案很好。但如果您只想替换三个或更多相同非字母字符的序列,反向引用会有所帮助:

>>> r3 = re.compile(r'(([^\s\w])\22,)')
>>> r3.findall('&&&xxx!&?yyy*****')
[('&&&', '&'), ('*****', '*')]

所以,例如:

>>> r3.sub('', '&&&xxx!&?yyy*****')
'xxx!&?yyy'

【讨论】:

+1,我回来为我的答案添加反向引用,但我会让你拥有它... :) @John,是的,但正如@Stephen 已经解释的那样,OP 在英语中犯了一个小错误,而不是在他的期望行为示例中完全大错特错;-)。【参考方案3】:

您不能(很容易,使用正则表达式)将其替换为与被替换文本长度相同的“空白字符串”。您可以将其替换为空字符串 "" 或单个空格 " " 或您选择的任何其他常量字符串;我在示例中使用了"*",以便更容易看到正在发生的事情。

>>> re.sub(r"(\W)\13,", "*", "12345<><>aaaaa%%%11111<<<<..>>>>")
'12345<><>aaaaa%%%11111*..*'
>>>

仔细注意:它不会改变“”......我假设“出现超过 3 次的非字母符号”意味着相同的符号必须发生超过 3 次”。我还假设您的意思是“超过 3”而不是“3 或更多”。

【讨论】:

以上是关于python中用正则表达式去掉文本中所有的标点符号的主要内容,如果未能解决你的问题,请参考以下文章

如何修改与 Python 中特定正则表达式匹配的文本?

采用 Unicode 标点属性方式的正则表达式,可以去掉所有的标点符号,

正则表达式 最近在做文本清洗,遇到(,,!或者?!!,),想要清除第一个逗号后面的所有多余标点符号

怎么让HTML显示纯文本

Python 正则表达式和版权符号

Python数据分析8-----网页文本处理