用正则表达式修正标点符号

时间:2016-02-01 21:45:08

标签: python regex

我想制作一个正则表达式,用标点符号修复各种语法错误。只有一些简单的要求:

  • 在一个单词(没有空格)
  • 之后,应该模仿标点符号
  • 标点符号后应始终有空格
  • 重复的标点符号之间应该没有空格

到目前为止,我得到了这个:

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

替换为\ 1。这修复了第1点和第2点,但它也在标点符号之间添加了空格。

我尝试运行另一个正则表达式来修复第3点:

[!?.,]( )[!?,.]

但这也会删除标点符号本身,即使它们不属于任何捕获组?

示例行为

输入:“什么!是。这个,gdjs gf fg fddsf ...”

期望的输出:“什么!是这个,这个,gdjs gf fg fddsf ...”

2 个答案:

答案 0 :(得分:2)

您需要将多个标点符号与空格匹配,然后删除lambda中标点符号之间的空格:

import re

fix_spaces = re.compile(r'\s*([?!.,]+(?:\s+[?!.,]+)*)\s*')
text = "what! is .this this,gdjs gf fg fddsf . . ."
text = fix_spaces.sub(lambda x: "{} ".format(x.group(1).replace(" ", "")), text)
print(text.strip())

请参阅IDEONE demo

您可以在lambda中使用正则表达式来删除空格:

re.sub(r"\s+", "", x.group(1))

正则表达式匹配:

  • \s* - 领先的空白(零或更多)
  • ([?!.,]+(?:\s+[?!.,]+)*) - 第1组匹配[?!.,]集合中的一个或多个字符,后跟零个或多个一个或多个空格组,后跟[?!.,]集合中的一个或多个标点符号< / LI>
  • \s* - 零个或多个尾随空格。

答案 1 :(得分:0)

根据您提供的缺乏任何特定风味的信息,我提出了以下解决方案。

正则表达式/(?<=[A-Za-z])[?!.,]+(?= )/g

<强>解释

1)[?!.,]+(?= )匹配一个或多个标点,后跟空格。

2)(?<=[A-Za-z])匹配的标点符号前面应至少有一个字母。

Regex101 Demo