替换字符串/句子中模式的一部分



有一个文本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|$)'

最新更新