regex 正则表达式:匹配小数点前没有数字的十进制数字

sr4lhrrt  于 2023-03-24  发布在  其他
关注(0)|答案(3)|浏览(181)

我尝试使用正则表达式匹配字符串中小数点前没有数字的十进制数字。例如,我有以下字符串:

The dimensions of the object-1 is: 1.4 meters wide, .5 meters long, 5.6 meters high
The dimensions of the object-2 is: .8 meters wide, .11 meters long, 0.6 meters high

我只想捕获不带整数位的十进制数,并在它们前面加上前缀零,所以我最终想要的输出将是:

The dimensions of the object-1 is: 1.4 meters wide, 0.5 meters long, 5.6 meters high
The dimensions of the object-2 is: 0.8 meters wide, 0.11 meters long, 0.6 meters high

这是我迄今为止所尝试的:

(\d+)?\.(\d+)

此表达式捕获所有十进制数,例如:1.4, .5, 5.6, .8, .11, 0.6 .
但我只需要捕获不含整数位的十进制数:.5, .8, .11 .

q9yhzks0

q9yhzks01#

使用负向后查找:(?<!\d)(\.\d+)

nx7onnlm

nx7onnlm2#

你可以做一个正则表达式替换与负查找一个数字。
正则表达式-(?<!\d)(\.\d+)

  • (?<!\d)-检查正则表达式前面没有数字
  • (\.\d+)-捕获点和一个或多个连续数字

替代-0\1

  • 0-为捕获添加一个零
  • \1-对捕获组的反向引用,该捕获组是以点开始的浮点数

Regex101 Demo for python regex flavour

Python代码示例

import re

string = "The dimensions of the object-1 is: 1.4 meters wide, .5 meters long, 5.6 meters high \nThe dimensions of the object-2 is: .8 meters wide, .11 meters long, 0.6 meters high"
pattern = r"(?<!\d)(\.\d+)"

match = re.search(pattern, string)
new_string = re.sub(pattern, "Number: 0\\1", string)

print(new_string)
5jdjgkvh

5jdjgkvh3#

按照你的意图做似乎很奇怪。为什么不捕获所有的浮点数并格式化它们呢?re.sub将接受一个函数作为repl参数。该函数应该接受一个match作为其参数,并返回一个str。你可以使用这种方法来格式化所有的浮点数。

import re

data = """
The dimensions of the object-1 is: 1.4 meters wide, .5 meters long, 5.6 meters high
The dimensions of the object-2 is: .8 meters wide, .11 meters long, 0.6 meters high
"""

reg   = re.compile(r'\d*\.\d+')
frepl = lambda m: f'{float(m.group(0))}'
data  = reg.sub(frepl, data)

print(data)
The dimensions of the object-1 is: 1.4 meters wide, 0.5 meters long, 5.6 meters high
The dimensions of the object-2 is: 0.8 meters wide, 0.11 meters long, 0.6 meters high

相关问题