删除两个句点之间的数字

Remove digits between two fullstops

有什么方法可以删除 python 中两个句号之间的数字吗?

例如:

我尝试了以下正则表达式,但没有得到首选输出。

output = re.sub(r'([^A-Z].[0-9])+)', input)

您可以尝试在 \s*\.\d+\. 上进行替换,然后只替换为一个句号。

inp = ["remove 1 from .1.", "XYZ is a student.2. XYZ is a boy.3. XYZ is smart."]
output = [re.sub(r'\s*\.\d+\.', '.', x) for x in inp]
print(output)

这会打印:

['remove 1 from.', 'XYZ is a student. XYZ is a boy. XYZ is smart.']

您的代码中有一些值得注意的地方。

  • 使用 re.sub 需要 3 个参数,您提供了 2 个参数。

  • 避免naming your variableinput

  • 您示例中的模式 ([^A-Z].[0-9])+) 不是有效模式,因为末尾有一个不匹配的括号。

如果你删除它,你有这个模式 [^A-Z].[0-9] 它匹配除 A-Z 之外的单个字符,一个匹配任何字符和数字的点。

这意味着该模式可以比预期匹配更多。


如果您不想更改 ip 号码或浮点数,您可以断言匹配前没有数字(并注意转义点以按字面匹配)

该模式与 @Tim Biegeleisen 发布的模式相同,只是前导负后视断言没有前导数字。

(?<!\d)\s*\.\d+\.

Regex demo

例子

import re

strings = ["remove 1 from .1.", "XYZ is a student.2. XYZ is a boy.3. XYZ is smart.", "test 127.0.0.1 test"]

for s in strings:
    print(re.sub(r'(?<!\d)\s*\.\d+\.', '.', s))

输出

remove 1 from.
XYZ is a student. XYZ is a boy. XYZ is smart.
test 127.0.0.1 test