检测标点符号后缺失的 space 和标点符号前的 space

Detect missing space after punctuation and space before punctuation

我想检测缺少的 space 标点符号和额外的 space before 标点符号。我尝试使用正则表达式来匹配 [A-Za-z0-9][?.,:!][A-Z][A-Za-z0-9]\s+[?.,:!],但是当应用于字符串 Something is in the air tonight.Or is it ?.

时,这两个 return None
import re

mystring = "Something is in the air tonight.Or is it ?"

missing_space_regex = re.compile('[A-Za-z0-9][?.,:!][A-Z]')
print(missing_space_regex.match(mystring))

extra_space_regex = re.compile('[A-Za-z0-9]\s+[?.,:!]')
print(extra_space_regex.match(mystring))

我意识到上面的 extra_space_regex 不会检测文本以标点符号开头的情况,但我可以将其作为特殊情况处理。

如果可以使用 regex 而不是 re,则可以利用正则表达式 Unicode 字符 类,例如 \p{P} 用于标点符号:

import regex

mystring = "Something is in the air tonight.Or is it ?"

missing_space_regex = regex.compile(r'.*?\p{P}\S')
print(missing_space_regex.match(mystring))

extra_space_regex = regex.compile(r'.*?\s\p{P}')
print(extra_space_regex.match(mystring))

输出:

<regex.Match object; span=(0, 33), match='Something is in the air tonight.O'>
<regex.Match object; span=(0, 42), match='Something is in the air tonight.Or is it ?'>

如果您确实想使用您选择的标点符号和 re:

punc = "?.,:!"

missing_space_re = re.compile(f".*?[{punc}]\S")
print(missing_space_re.match(mystring))

extra_space_re = re.compile(f'.*?\s[{punc}]')
print(extra_space_re.match(mystring))