Python 如何仅从字符串末尾删除字符?

Python 如何仅从字符串末尾删除字符?,python,Python,我有以下代码,我从末尾删除了-dev.和-rel.,但是当我有类似于com devices.lnx.1.0-dev的东西时,它会从一开始就删除,并输出com,我希望它在哪里打印com devices.lnx,请参阅下面的branch3…如何仅从末尾删除dev.* import re chars_to_remove = ['-dev.*','-rel.*'] # modify char to remove here def remove_char(s): return re.sub("({

我有以下代码,我从末尾删除了
-dev.
-rel.
,但是当我有类似于
com devices.lnx.1.0-dev
的东西时,它会从一开始就删除,并输出
com
,我希望它在哪里打印
com devices.lnx
,请参阅下面的branch3…如何仅从末尾删除dev.*

import re
chars_to_remove = ['-dev.*','-rel.*'] # modify char to remove here
def remove_char(s):
    return re.sub("({})$".format('|'.join(chars_to_remove)), '',  s)

branch1 = 'bt.lnx.2.1-dev.1.0'
branch2 = 'bt.lnx.2.1-rel.1.0'
branch3 = 'com-devices.lnx.1.0-dev'
print remove_char(branch1) # 'bt.lnx.2.1'
print remove_char(branch2) # 'bt.lnx.2.1'
print remove_char(branch3) # should print com-devices.lnx.1.0

看起来不需要正则表达式。只需在
'-'
上执行
str.rsplit
,将其限制为一次拆分:

>>> branch1 = 'bt.lnx.2.1-dev.1.0'
>>> branch2 = 'bt.lnx.2.1-rel.1.0'
>>> branch3 = 'com-devices.lnx.1.0-dev'
>>> branch1.rsplit('-', 1)[0]
'bt.lnx.2.1'
>>> branch2.rsplit('-', 1)[0]
'bt.lnx.2.1'
>>> branch3.rsplit('-', 1)[0]
'com-devices.lnx.1.0'

看起来不需要正则表达式。只需在
'-'
上执行
str.rsplit
,将其限制为一次拆分:

>>> branch1 = 'bt.lnx.2.1-dev.1.0'
>>> branch2 = 'bt.lnx.2.1-rel.1.0'
>>> branch3 = 'com-devices.lnx.1.0-dev'
>>> branch1.rsplit('-', 1)[0]
'bt.lnx.2.1'
>>> branch2.rsplit('-', 1)[0]
'bt.lnx.2.1'
>>> branch3.rsplit('-', 1)[0]
'com-devices.lnx.1.0'

你的
*
太宽了。如果我们(从您的示例中)假设
-dev
-rel
后面只能跟一个数字版本号,请尝试以下操作:

chars_to_remove = ['-dev[0-9.]*','-rel[0-9.]*']

你的
*
太宽了。如果我们(从您的示例中)假设
-dev
-rel
后面只能跟一个数字版本号,请尝试以下操作:

chars_to_remove = ['-dev[0-9.]*','-rel[0-9.]*']

我认为您认为
dev.*
的意思是“dev后面跟一个句点,后面跟任何东西”——这就是在一个应用程序中的命令行上的意思

在实正则表达式中,句号并不表示句号,它表示“任何字符”,星号不表示“任何字符串”,它表示“最后一个模式,任意次数(包括零次)”

你想要

pat = re.compile('-(dev|rel)\..*$')
def remove_suffix(x):
  return pat.sub("", x)

我认为您认为
dev.*
的意思是“dev后面跟一个句点,后面跟任何东西”——这就是在一个应用程序中的命令行上的意思

在实正则表达式中,句号并不表示句号,它表示“任何字符”,星号不表示“任何字符串”,它表示“最后一个模式,任意次数(包括零次)”

你想要

pat = re.compile('-(dev|rel)\..*$')
def remove_suffix(x):
  return pat.sub("", x)

句点匹配任何字符。这有点像grep1-0-1。你说你想删除
dev.
,然后你说给定的输入
com devices.lnx.1.0-dev
你想输出
com devices.lnx
。但这不是删除
dev.*
而是删除
*-dev
!那么,您想要的输入和输出究竟是什么?@JohnZwinck-我在每次打印后都添加了我想要的输出作为注释……我现有的代码适用于branch1和branch2,但不适用于branch3,我需要同样的代码all@RadLexus-我如何让它不那么贪婪?@JohnZwinck-我更新了任务,它应该是
-dev.*和-rel.*
句点匹配任何字符。这有点像grep1-0-1。你说你想删除
dev.
,然后你说给定的输入
com devices.lnx.1.0-dev
你想输出
com devices.lnx
。但这不是删除
dev.*
而是删除
*-dev
!那么,您想要的输入和输出究竟是什么?@JohnZwinck-我在每次打印后都添加了我想要的输出作为注释……我现有的代码适用于branch1和branch2,但不适用于branch3,我需要同样的代码all@RadLexus-我如何让它不那么贪婪?@JohnZwinck-我更新了任务,它应该是
-dev.*和-rel.*
注意,当你说“在命令行上”时,它的名称是“shell模式”或“glob”。如果人们希望
*
表示“任何东西”和
表示“一个字符”,那么人们可以搜索一些单词。请注意,当你说“在命令行上”时,它的名称是“shell模式”或者“glob.”如果人们希望
*
表示“任何东西”和
表示“一个字符”,那么他们可以搜索一些单词