主要问题是$
字符类内部表示文字$
符号,你只需要一个分组结构 here.
我建议使用以下代码:
import re
regex = r"([^\W_])\.(?:\s+|$)"
ss = ["I want a hotel.","my email is [email protected]", "I have to play. bye!"]
for s in ss:
result = re.sub(regex, r"\1 . ", s).rstrip()
print(result)
See the Python演示.
如果您需要仅在行上应用此功能而不影响换行符,则可以使用
import re
regex = r"([^\W_])\.(?:[^\S\n\r]+|$)"
text = "I want a hotel.\nmy email is [email protected]\nI have to play. bye!"
print( re.sub(regex, r"\1 . ", text, flags=re.M).rstrip() )
See 这个Python演示.
Output:
I want a hotel .
my email is [email protected]
I have to play . bye!
Details:
-
([^\W_])
- 第 1 组匹配任何字母或数字
-
\.
- 一个字面点
-
(?:\s+|$)
- 匹配 1 个以上空格或字符串锚结尾的分组(此处,$
匹配字符串的结尾。)
The rstrip
将删除替换期间添加的尾随空格。
如果您使用的是 Python 3,[^\W_]
默认情况下将匹配所有 Unicode 字母和数字。在Python 2中,re.U
标志将启用此行为。
注意\s+
在最后(?:\s+|$)
会将多个空格“收缩”为 1 个空格。