regex python正则表达式替换所有数字,除非它们是子字符串的一部分

c3frrgcw  于 2022-11-18  发布在  Python
关注(0)|答案(2)|浏览(150)

我想删除所有的数字,除非这些数字组成了一个特殊的子字符串。在下面的例子中,我应该跳过数字删除的特殊子字符串是1 s,2s,s4,3s。我想我需要使用负前瞻

s = "a61s8sa92s3s3as4s4af3s"
pattern = r"(?!1s|2s|s4|3s)[0-9\.]"
re.sub(pattern, ' ', s)

以我的理解,上面的模式是:

  • 从末尾([])开始匹配所有数字,包括小数
  • 只有在我们没有匹配的模式后才这样做吗?!
  • 其为1 s、2s、s4或3s(|=或)

上面的示例s返回a 1s sa 2s3s as s af3s,这意味着所有的排除模式都在工作,除非数字位于特殊子字符串的末尾,在这种情况下,它仍然匹配?!
我相信这个操作应该返回a 1s sa 2s3s as4s4af3s,如何修复我的模式?

kr98yfug

kr98yfug1#

您可以使用

import re
s = "a61s8sa92s3s3as4s4af3s"
pattern = r"(1s|2s|s4|3s)|[\d.]"
print( re.sub(pattern, lambda x: x.group(1) or ' ', s) )
# => a 1s sa 2s3s as4s4af3s

请参阅Python demo

  • 详细数据 *:
  • (1s|2s|s4|3s)-组1:1s2ss43s
  • |-或
  • [\d.]-数字或点。

如果Group 1匹配,则Group 1值为替换值,否则为空格。

n7taea2i

n7taea2i2#

尝试(regex101):

import re

s = "a61s8sa92s3s3as4s4af3s"

s = re.sub(r"(?!1s|2s|3s)(?<!s(?=4))[\d.]", " ", s)
print(s)

印刷品:

a 1s sa 2s3s as4s4af3s

相关问题