【问题标题】:Punctuation correction with regex使用正则表达式进行标点校正
【发布时间】:2016-02-02 06:53:08
【问题描述】:

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

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

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

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

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

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

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

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

行为示例

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

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

【问题讨论】:

  • 什么正则表达式风格并添加一些示例
  • word 你的意思是一个字母数字字符?还是别的什么?
  • 您能发布任何示例字符串进行测试吗?
  • this demo 呢?
  • 正如regex tag info 所述,所有带有此标签的问题还应包含一个指定适用的编程语言或工具的标签。请注意,Python re 模块不如 .NET、Boost 或 PCRE/PCRE2 正则表达式功能强大,因此,很多事情应该通过代码完成。

标签: python regex


【解决方案1】:

您需要将多个标点符号与空格一起匹配,然后删除 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 组匹配 [?!.,] 集中的一个或多个字符,后跟零个或多个由一个或多个空格组成的组,后跟 [?!.,] 集中的一个或多个标点符号
  • \s* - 零个或多个尾随空格。

【讨论】:

    【解决方案2】:

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

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

    解释

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

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

    Regex101 Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 2020-02-18
      • 2014-08-30
      • 2013-05-29
      相关资源
      最近更新 更多