我试图删除字符串中的所有数字,只要数字以“”,“克”,“g”,“kg”或“千克”结尾。
我正在使用正则表达式,但它没有删除任何数字。 出了什么问题?
例如;字符串"abc 1231g kjsjk jkdsfkjdkj 11kg"
应该生成"abc kjsjk jkdsfkjdkj "
Python代码:
from re import sub
test = "abc 1231g kjsjk jkdsfkjdkj 11kg"
test = sub("[\d]+[\sg|$grams|$kg|$kilograms]$"," ",test)
print test # every number is still there
答案 0 :(得分:1)
方括号[...]
和美元符号$
并不代表您的想法。你需要:
test = sub("\d+\s(g|grams|kg|kilograms)"," ",test)
[\sg|$grams|$kg|$kilograms]
的含义是“空格字符(\s
)或任何这些字符:g|$grams|$kg|$kilograms
”;因此[\sg|$grams|$kg|$kilograms]
相当于[\s$agiklomrs]
,大致相当于(\s|\$|a|g|i|k|l|o|m|r|s)
。
$
的含义是“只有在字符串的最后才匹配”。
答案 1 :(得分:1)
您的正则表达式无法捕捉您正在寻找的内容。方括号[]
表示定义一个字符类,因此[\sg|$...]
不是您想要的。你应该试试:
test = sub("\d+(\s|g|grams|kg|kilograms)", " ", test)
在这里,我们从数字\d+
开始,然后使用括号()
进行分组,并将所有可能的后缀放入其中,以|
分隔。
要获得您指定的输出,我们需要更改一些内容。替换字符串应为""
而不是" "
,我们需要通过将\s?
附加到正则表达式来最后获取额外的空格。
test = sub("\d+(\s|g|grams|kg|kilograms)\s?", "", test)
答案 2 :(得分:0)
\d+\.?\d*
来计算十进制数;
并且你会希望订单为grams|g
,因为它不会让你留下公羊。
import re
test = "A test with 1a and 123 and 129kg and 80.5g and 5grams."
test2 = re.sub("\d+\.?\d*(\s|grams|g|kg|kilograms)\s?", "", test)
test2: 'A test with 1a and and and and .'
问题可能意味着您只想删除数字(留下后缀),
在这种情况下,您可以使用正向前瞻断言(?=...)
:
test2 = re.sub("\d+\.?\d*(?=\s|grams|g|kg|kilograms)\s?", "", test)
test2 :'A test with 1a and and kg and g and grams.'