2014-07-11 80 views
0

如何删除撇号,双引号,逗号等所有单词,不包括像它是什么,什么是等字。句子中必须有句号和句号之间的空格。如何不删除撇号文本文件中的某些单词的撇号

例如

输入句子:

"'This has punctuation, and it's hard to remove. ?"  

所需的输出句子:

This has punctuation and it's hard to remove . 
+0

请问您能否提供更多的例子并且更清楚地定义'etc'? – Jerry

+0

如果我有像下面的例子这样的句子,我想删除所有标点符号,除了这样的单词之外,单词和句尾之间有什么和需要空格。 INPUT File:“'我从Best Buy购买了30美元这是什么 什么是浪费金钱!耳朵凝胶首先是舒适的,但一小时后会怎么样 期望的输出:我从百思买买了它30 浪费金钱耳朵凝胶起初很舒服,但是一小时后会怎么样 – user3232688

+0

你可以把它放在你的问题中,并适当地设置它的格式吗?有些边缘情况你可能没有考虑过:如果你有'你有没有见Cress的发型吗?“这个'东西'有一个非常不好的习惯,你知道吗?'那些成为什么? – Jerry

回答

1

我提出这样的代码:

import re 

sentences = [""""'This has punctuation, and it's hard to remove. ?" """, 
      "Did you see Cress' haircut?.", 
      "This 'thing' hasn't a really bad habit, you know?.", 
      "'I bought this for $30 from Best Buy it's. What a waste of money! The ear gels are 'comfortable at first, but what's after an hour."] 

for s in sentences: 
    # Remove the specified characters 
    new_s = re.sub(r"""["?,$!]|'(?!(?<! ')[ts])""", "", s) 

    # Deal with the final dot 
    new_s = re.sub(r"\.", " .", new_s) 
    print(new_s) 

ideone demo

输出:

This has punctuation and it's hard to remove . 
Did you see Cress haircut . 
This thing hasn't a really bad habit you know . 
I bought this for 30 from Best Buy it's . What a waste of money The ear gels are comfortable at first but what's after an hour . 

正则表达式:

["?,$!]  # Match " ? , $ or ! 
|   # OR 
'   # A ' if it does not have... 
(?!   
    (?<! ') 
    [ts]  # t or s after it, provided it has no ` '` before the t or s 
) 
+0

谢谢@杰里,但如何删除撇号下面的话Cress'= Cress – user3232688

+0

@ user3232688哦,哎呀。不知何故,我认为它应该保持。给我几分钟来解决这个问题。好的,改变了。 – Jerry

+0

非常感谢你@Jerry – user3232688

0

使用用于外部引号

像这样string.strip(定界符)函数:

output = chaine.strip("\"") 

请注意,您必须使用'\'(如',',\,等等)来转义某些字符。或者你可以输入他们为''“,'''(不确定)。

编辑:mmh,没有考虑撇号,如果唯一的问题是撇号,你可以先解开它,然后手动解析它用for语句,找到找到的第一个撇号的指示符,然后如果后跟一个's',就把它留下,我不知道,你必须在编码之前设置词汇/语义规则。

编辑2: 如果该字符串只是一个句子,总是在最后一个点,总是需要的空间,然后在最后使用:

chaine[:-2]+" "+chaine[-2:] 
+0

'strip'只能用于去除前导和尾随字符。 – timgeb

+0

编辑我的答案,但不知道引号是否是输入的一部分,我认为是这样,因为他们没有在期望的输出。 – PhilDenfer

2

使用负查找behin d

(?<!\w)["'?]|,(?=) 

除去匹配'"?字符通过re.sub

DEMO

而且你的代码会是这样,

>>> s = '\"\'This has punctuation, and it\'s hard to remove. ?\" ' 
>>> m = re.sub(r'(?<!\w)[\"\'\?]|,(?=)', r'', s) 
>>> m 
"This has punctuation and it's hard to remove. " 
+1

逗号缺失。 '''''''第二个撇号不会包含在正则表达式中 – Braj

+0

@Braj我认为现在没关系 –

+0

这会使'?'成为'OK'吗?(例如,它也会将逗号留在'汽车,'等),不知道这是否正常与OP? – zx81

0

使用此:

(?<![tT](?=.[sS]))["'?:;,.] 

如果你也想在一行的末尾离开期间(只要它前面有一个空格):

(?<![tT](?=.[sS]))(?<! (?=.$))["'?:;,.] 
+0

仅供参考,它是正确的比它听起来有点复杂,这就是为什么我的正则表达式更长一点。增加了第二个版本,离开了(如果前面有一个空格) – zx81

0

我想这是,删除所有在任何一个单词结尾的引文。因此从单词分割句子字(由白色空间隔开)并去掉任何前导或尾随引号

>>> ''.join(e.strip(string.punctuation) for e in re.split("(\s)",st)) 
"This has punctuation and it's hard to remove " 
+0

仍然有'标点符号',OP想要删除',' –

+0

@PadraicCunningham:我最初展示了这个方法,你想要剥离什么,你需要添加一个明确的列表,在这个特定的情况下,我已经包含'string.punctuation' – Abhijit

+0

@Ahhijit如何保持文件末尾的单词和句点之间的空格,并且可以让我知道输入句子是否类似下面。“'我买了这个从Best Buy购买30美元。多浪费钱!耳朵一开始很舒服,但一小时后会怎样?所需的输出必须如下:我从百思买那里购买了30张。 浪费金钱耳朵一开始很舒服,但一小时左右后,耳朵开始真的受到伤害。 – user3232688