我想制作一个正则表达式,用标点符号修复各种语法错误。只有一些简单的要求:
到目前为止,我得到了这个:
(?:\s*)([?!.,]+)(?:\s*)
替换为\ 1。这修复了第1点和第2点,但它也在标点符号之间添加了空格。
我尝试运行另一个正则表达式来修复第3点:
[!?.,]( )[!?,.]
但这也会删除标点符号本身,即使它们不属于任何捕获组?
示例行为:
输入:“什么!是。这个,gdjs gf fg fddsf ...”
期望的输出:“什么!是这个,这个,gdjs gf fg fddsf ...”
答案 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 强>