2017-08-18 10 views
1

私はbashコードをPythonコードに変換しています。pythonのreモジュールで文字列の最後から最短一致パターンを削除する方法は?

今、私はbashで$ {variable%pattern}と同じ機能を持つ関数を作りたいと思います。これは、文字列の末尾から例えば

を最短一致パターンを削除し、私は期待delete_tail(「_ usr_home_you_file.ext.tar.oz」、R「」)結果 『_usr_home_you_file.ext.tar』

私はしかし、それは次のような最長マッチしたパターンを削除し、以下の

import re 

def delete_tail(word,pattern): 
    return re.sub('{0}.*?$'.format(pattern), '', word) 

をPythonの関数を作りました。

word='_usr_home_you_file.ext.tar.oz' 
delete_shortest_match_tail=delete_tail(word,r'\.') 
print("word = {0}".format(word)) 
print("delete_shortest_match_tail = {0}". format(delete_shortest_match_tail)) 

出力:

delete_shortest_match_tail = _usr_home_you_file 

は、どのように私は上記の予想通り、文字列の末尾から最短マッチしたパターンを削除機能を作ることができますか?

ありがとうございました。

答えて

1

パターンを置き換えるのではなく、パターンの前で文字列を検索する必要があります。正規表現は常に左から右に見え、すべてのマッチはその順番で報告されます。文字列を単に逆順にすることはできません。これは、RegExパターンを壊すためです。そのため、subは使用できませんが、何かを空の文字列に置き換えることは、削除することと同じです。残りの文字列はになります。これは基本的にこのソリューションの機能です。結果を検索し、不要な部分を単に省略します。

def removeFromEnd(pattern, target): 
    m = re.match("(.*)" + pattern + ".*$", target) 
    if m: 
    return m.group(0) 
    else: 
    return target 

>>> removeFromEnd( "\。"、 "foo.tar.gz")

'foo.tar'

+0

を解決する方法を私に教えてくれてありがとう問題。出来た。 2つの質問をお願いします。 (1)それは必要ですか? "。*?$"にあります。どちらの場合でも、「?」の有無にかかわらず私の場合と同じように動作します。 (2)len(m.groups())> 0をチェックする必要がある理由を理解できませんでした。mがNoneでないことがチェックされると思います。どうもありがとうございました。 – mora

+1

@moraあなたは正しいです、両方とも冗長であり、削除することができます。私は答えを編集しました。私はまた、グループ0の条件と検索を簡略化しました。 –

+0

もう一度素晴らしいソリューションに感謝します。 – mora

関連する問題