Python:以积极的前瞻性删除标点符号之间的空格

时间:2018-07-29 11:02:55

标签: python regex punctuation

我正在尝试删除句子中标点符号之间的空格。为了说明这一点,数据集具有许多如下所示的字符串:

 "This is a very nice text : ) : ) ! ! ! ."

但是我希望他们看起来像这样:

 "This is a very nice text :):)!!!."

我想使用RegEx positive lookahead来做到这一点,但是有人可以告诉我如何在Python中做到这一点。我现在有代码,但是通过添加额外的空格来实现与我想要的相反的操作:

 string = re.sub('([.,!?()])', r' \1', string)

2 个答案:

答案 0 :(得分:4)

原则上,您可以找到(捕获的)标点符号之间的空格(空格?),并仅替换捕获的标点符号:

import java.util.Scanner;

public class hello {

    public static void main(String[] args) {

        int name;

        Scanner sc = new Scanner(System.in);

        System.out.println("Enter your name");


        name = sc.nextInt(); 

         sc.close();

         System.out.println("Your name"+name);


    }
}

但是,这将导致

string = re.sub('([:.,!?()]) ([:.,!?()])', r'\1\2', string)

因为This is a very nice text :) :) !! !. 不考虑重叠匹配


因此,您需要使用零宽先行和后行-它们不计入匹配项,因此匹配的部分只是空格字符,然后我们将其替换为空字符串。

re.sub

其结果为string = re.sub('(?<=[:.,!?()]) (?=[:.,!?()])', '', string)

答案 1 :(得分:2)

您可以使用如下正则表达式:

(?<=[.:,!?()])\s+(?=[.:,!?()])

在括号之间的两个部分是向后看向后看,它们用于查找标点符号。然后,我们匹配\s+(一个或多个空格部分)。然后,我们可以将其替换为空字符串。例如:

import re

rgx = re.compile(r'(?<=[.:,!?()])\s+(?=[.:,!?()])')

rgx.sub('', 'This is a very nice text : ) : ) ! ! ! .')

然后产生:

>>> rgx.sub('', 'This is a very nice text : ) : ) ! ! ! .')
'This is a very nice text :):)!!!.'