pandas 正则表达式完全匹配

0pizxfdo  于 2022-12-21  发布在  其他
关注(0)|答案(2)|浏览(174)

我有下面这句话:“饭盒的大小在1.5升或1500毫升左右”
如何将其更改为:“饭盒的容量在1.5升或1500毫升左右”
在某些情况下,该值也可能显示为“1.5 l或1500 ml”,并带有空格。
当我试图构建一个函数时,我无法捕获“l”或“ml”,或者它给了我一个转义错误。
我试过:

def stnd(text):

text = re.sub('^l%',' liter', text) 
text = re.sub('^ml%',' milliliter', text) 

text = re.sub('^\d+\.\d+\s*l$','^\d+\.\d+\s*liter$', text) 
text = re.sub('^^\d+\.\d+\s*ml$%','^\d+\.\d+\s*milliliter$', text) 

return text
qzwqbdag

qzwqbdag1#

您可以使用dict列出所有单位作为键,并使用模式查找后跟mll的数字,然后您可以将其用作dict的键以获取值。

(?<=\d)m?l\b

模式匹配:

  • (?<=\d)正向后看,向左置位一个数字
  • m?l\b匹配可选的m,后跟b和单词边界

参见regex demo
示例

s = "The size of the lunch box is around 1.5l or 1500ml"
pattern = r"(?<=\d)m?l\b"
dct = {
    "ml": "milliliter",
    "l": "liter"
}
result = re.sub(pattern, lambda x: " " + dct[x.group()] if x.group() in dct else x, s)
print(result)

产出

The size of the lunch box is around 1.5 liter or 1500 milliliter
t1rydlwq

t1rydlwq2#

我们可以使用查找值和替换的字典来处理这个替换。

d = {"l": "liter", "ml": "milliliter"}
inp = "The size of the lunch box is around 1.5l or 1500ml"
output = re.sub(r'(\d+(?:\.\d+)?)\s*(ml|l)', lambda m: m.group(1) + " " + d[m.group(2)], inp)
print(output)

# The size of the lunch box is around 1.5 liter or 1500 milliliter

def stnd(text):
    return re.sub(r'(\d+(?:\.\d+)?)\s*(m?l)', lambda m: m.group(1) + " " + d[m.group(2)], text)

相关问题