Python:删除字符串的最后一个数字
Python: remove last number of a string
我需要 4 行代码来执行此脚本,但我认为可以在 2 行中完成(甚至可能是 1 行!让我们梦想吧)。有人有解决方案吗?
您可以测试代码以查看预期结果。
def remove_nbr_at_the_end_of_the_string(my_str):
while my_str[-1] in ["0", "1", "2", "3" ,"4" ,"5" ,"6" ,"7" ,"8" ,"9"]:
my_str = my_str[:-1]
if my_str[-1] == " ": my_str = my_str[:-1]
return my_str
for text in ["ACCDS 122", "GR DDF 0332", "MLMD 12 334", "MMED DFE"]:
print(remove_nbr_at_the_end_of_the_string(text))
你可以用一个正则表达式在一行中完成(嗯,两个,对于 import re
):
import re
for text in ["ACCDS 122", "GR DDF 0332", "MLMD 12 334", "MMED DFE"]:
print(re.sub(r" ?\d+$", "", text))
产生:
ACCDS
GR DDF
MLMD 12
MMED DFE
注意 ?
之前的 space。这将限制它只删除一个数字,加上 space,如果有的话。如果你想扩展到其他形式的白色space,比如标签,你可以用\s
替换。
另请注意,如所写,这将删除任何在 Unicode 中被视为数字的内容。如果你想限制到 0-9
,使用这个:
re.sub(r" ?\d+$", "", text, re.ASCII)
作为未来的 FYI,您的 while 循环条件可以简化为:
while my_str[-1] in "0123456789":
您可以使用正则表达式
import re
def remove_nbr_at_the_end_of_the_string(my_str):
found_numbers = re.findall(r'\d+', my_str)
return my_str.replace(found_numbers[-1], "") if (found_numbers) else my_str
这会查找数字,从末尾使用“r”开始。
如果它找到任何它会删除第一个(从后面),否则字符串将按原样返回。
如评论中所述,rstrip
效果很好。如果你想在没有任何 method/other 库的情况下创建你自己的 rstrip 函数,也可以这样做:
def my_rstrip(my_str):
if(my_str[-1] in ("1","2","3","4","5","6","7","8","9","0"," ")): return my_rstrip(my_str[:-1])
return my_str
my_str = "123456qweqsd789 65"
print(my_rstrip(my_str))
>> 123456qweqsd
一点递归函数永远不会有坏处! (...如果你的字符串不是太长我猜?)
使用它删除最后一个数字以及末尾的 space。
my_str.rstrip('0123456789').strip()
如果要删除字符串末尾出现的所有数字,可以按如下方式进行:
def remove_nbr_at_the_end_of_the_string(my_str):
return [' '.join([j.rstrip('0123456789') for j in i.split()]).strip() for i in my_str]
text = ["ACCDS 122", "GR DDF 0332", "MLMD 12 334", "MMED DFE"]
print(remove_nbr_at_the_end_of_the_string(text))
你会得到:
['ACCDS', 'GR DDF', 'MLMD', 'MMED DFE']
如果您真的坚持在不使用 rstrip 的情况下对其进行单衬里:
print("\n".join([string[:len(string)-len(([string[len(string)-i:] for i in range(1, len(string)) if string[len(string)-i:].isdigit()] or [""])[-1])].strip() for string in ["ACCDS 122", "GR DDF 0332", "MLMD 12 334", "MMED DFE"]]))
输出:
ACCDS
GR DDF
MLMD 12
MMED DFE
如果满足str.is_digit(),此方法从右侧创建一个扩展window字符列表,然后取最后一个元素(最大有效数字串)扩展 window 列表并使用最长有效数字字符串的长度来分割原始字符串。然后字符串中的空格被去除。
这个单行代码中有一个特别偷偷摸摸的部分,它利用了元组条件元素创建,例如:
([] or [""])
如果第一个元素为假,则取第二个元素。
我需要 4 行代码来执行此脚本,但我认为可以在 2 行中完成(甚至可能是 1 行!让我们梦想吧)。有人有解决方案吗? 您可以测试代码以查看预期结果。
def remove_nbr_at_the_end_of_the_string(my_str):
while my_str[-1] in ["0", "1", "2", "3" ,"4" ,"5" ,"6" ,"7" ,"8" ,"9"]:
my_str = my_str[:-1]
if my_str[-1] == " ": my_str = my_str[:-1]
return my_str
for text in ["ACCDS 122", "GR DDF 0332", "MLMD 12 334", "MMED DFE"]:
print(remove_nbr_at_the_end_of_the_string(text))
你可以用一个正则表达式在一行中完成(嗯,两个,对于 import re
):
import re
for text in ["ACCDS 122", "GR DDF 0332", "MLMD 12 334", "MMED DFE"]:
print(re.sub(r" ?\d+$", "", text))
产生:
ACCDS
GR DDF
MLMD 12
MMED DFE
注意 ?
之前的 space。这将限制它只删除一个数字,加上 space,如果有的话。如果你想扩展到其他形式的白色space,比如标签,你可以用\s
替换。
另请注意,如所写,这将删除任何在 Unicode 中被视为数字的内容。如果你想限制到 0-9
,使用这个:
re.sub(r" ?\d+$", "", text, re.ASCII)
作为未来的 FYI,您的 while 循环条件可以简化为:
while my_str[-1] in "0123456789":
您可以使用正则表达式
import re
def remove_nbr_at_the_end_of_the_string(my_str):
found_numbers = re.findall(r'\d+', my_str)
return my_str.replace(found_numbers[-1], "") if (found_numbers) else my_str
这会查找数字,从末尾使用“r”开始。 如果它找到任何它会删除第一个(从后面),否则字符串将按原样返回。
如评论中所述,rstrip
效果很好。如果你想在没有任何 method/other 库的情况下创建你自己的 rstrip 函数,也可以这样做:
def my_rstrip(my_str):
if(my_str[-1] in ("1","2","3","4","5","6","7","8","9","0"," ")): return my_rstrip(my_str[:-1])
return my_str
my_str = "123456qweqsd789 65"
print(my_rstrip(my_str))
>> 123456qweqsd
一点递归函数永远不会有坏处! (...如果你的字符串不是太长我猜?)
使用它删除最后一个数字以及末尾的 space。
my_str.rstrip('0123456789').strip()
如果要删除字符串末尾出现的所有数字,可以按如下方式进行:
def remove_nbr_at_the_end_of_the_string(my_str):
return [' '.join([j.rstrip('0123456789') for j in i.split()]).strip() for i in my_str]
text = ["ACCDS 122", "GR DDF 0332", "MLMD 12 334", "MMED DFE"]
print(remove_nbr_at_the_end_of_the_string(text))
你会得到:
['ACCDS', 'GR DDF', 'MLMD', 'MMED DFE']
如果您真的坚持在不使用 rstrip 的情况下对其进行单衬里:
print("\n".join([string[:len(string)-len(([string[len(string)-i:] for i in range(1, len(string)) if string[len(string)-i:].isdigit()] or [""])[-1])].strip() for string in ["ACCDS 122", "GR DDF 0332", "MLMD 12 334", "MMED DFE"]]))
输出:
ACCDS
GR DDF
MLMD 12
MMED DFE
如果满足str.is_digit(),此方法从右侧创建一个扩展window字符列表,然后取最后一个元素(最大有效数字串)扩展 window 列表并使用最长有效数字字符串的长度来分割原始字符串。然后字符串中的空格被去除。
这个单行代码中有一个特别偷偷摸摸的部分,它利用了元组条件元素创建,例如:
([] or [""])
如果第一个元素为假,则取第二个元素。