有一个文本blob,例如
"Text blob1. Text blob2. Text blob3 45.6%. Text blob4."
我想用空间" "
替换点,即"."
。但同时,出现在数字之间的点应该保留。例如,前面的例子应该转换为:
"Text blob1 Text blob2 Text blob3 45.6% Text blob4"
如果我使用:
p = re.compile('.')
s = p.sub(' ', s)
它用空格替换所有的点。
关于什么模式或方法在这里有效,有什么建议吗?
使用
.(?!(?<=d.)d)
见证明。此表达式将匹配后面没有数字且前面有数字和点的任何点。
解释
NODE EXPLANATION
--------------------------------------------------------------------------------
. '.'
--------------------------------------------------------------------------------
(?! look ahead to see if there is not:
--------------------------------------------------------------------------------
(?<= look behind to see if there is:
--------------------------------------------------------------------------------
d digits (0-9)
--------------------------------------------------------------------------------
. '.'
--------------------------------------------------------------------------------
) end of look-behind
--------------------------------------------------------------------------------
d digits (0-9)
--------------------------------------------------------------------------------
) end of look-ahead
此处可能不需要regex。用空格替换点空格。
s.replace('. ', ' ')
如果您有任何句点后跟换行符或终止字符串,这还不够好,但您仍然不需要regex:
s.replace('. ', ' ').replace('.n', 'n').rstrip('.')
假设字符串是
A.B.C blob3 45.6%. Text blob4.
匹配除前面和后面都有数字的句点之外的所有句点
如果更换后,字符串
A B C blob3 45.6% Text blob4
如果需要,可以使用具有正则表达式的re.sub
r'(?<!d).|.(?!d)'
将句点的匹配项替换为空字符串。
正则表达式显示,";匹配前面没有数字以外的字符或后面没有数字以外字符的周期";。
演示1
双负数用于匹配字符串开头或结尾的句点。可以使用逻辑等价物:
r'(?<=^|D).|.(?=D|$)'
匹配所有句点,但前后都有空白字符的句点除外
另一方面,如果在替换之后,字符串
A.B.C blob3 45.6% Text blob4
如果需要的话,可以将re.sub
与正则表达式一起使用
r'(?<!S).|.(?!S)'
将句点的匹配项替换为空字符串。
此正则表达式的内容为:;匹配前面没有空白字符或后面没有空白字符的周期";。
演示2
可以使用逻辑等价物:
r'(?<=^|s).|.(?=s|$)'