2016-12-10 7 views
0

は私がcom-devices.lnx.1.0-devのようなものを持っている場合しかし、それは始まり、私はそれがcom-devices.lnxを印刷することを期待として出力comからから削除し、私は端から-dev.*-rel.*を削除し、そこから次のコードを持って、下記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 
+2

をしたいです。それはGREP 1-0-1のようなものです。 – usr2564301

+1

あなたは 'dev。*'を削除したいと言っていますが、 'com-devices.lnx.1.0-dev'と入力して' com-devices.lnx'を出力したいとします。しかし、それは 'dev。* 'を削除していないので' * -dev'を削除しています!では、あなたの入力と出力は正確には何ですか? –

+0

@JohnZwinck - 各印刷後にコメントとして希望の出力を追加しました。既存のコードはbranch1とbranch2で動作しますが、branch3では失敗します。すべて同じ作業が必要です。 – user3508811

答えて

0

あなた.*は広すぎます。私はあなたがdev.*は、DEVが続くピリオド」を意味することを考えると思います

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

正規表現が必要なようには見えません。ただ、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' 
1

:私たちは-dev-relのみ数字のみのバージョン番号で続いてもよいことを(あなたの例から)と仮定した場合は、これを試してくださいコマンドラインでであり、それがUnix-like environmentであることを意味します。

実際の正規表現では、ピリオドはピリオドを意味するものではなく、「任意の文字」を意味し、アスタリスクは「任意の文字列」を意味するものではなく、「最後のパターン」 0回)」と表示されます。

あなたは、期間は任意の文字に一致し

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

"コマンドラインで "と言うとき、その名前は"シェルパターン "または" glob "です。人々は、「*」が「何か」を意味し、「?」が「1つの文字」を意味すると見なしただけで、いくつかの単語を検索することができます。 –