2016-01-31 9 views
17

次の方法でPythonの文字列を操作する方法はありますか?例えばドット表記に格納された任意の文字列については、ドット表記の文字列操作

s = "classes.students.grades" 

を次のように文字列を変更することが方法です:

"classes.students" 

基本的には、までのすべてを削除し、最後の期間を含む。したがって"restaurants.spanish.food.salty""restaurants.spanish.food"になります。

さらに、最後の期間の後に来るものを特定する方法はありますか?私がこれをしたい理由は、isDigit()を使用したいのです。

だから、それはclasses.students.grades.0だった場合、私は何とか0をつかむことができたので、私はisdigitとif文を使用して、最後の期間(この場合はそう0)の後の文字列の一部が数字であれば言うことができますそれを削除します。それ以外の場合は、そのままにします。

答えて

20

あなたが一緒にsplitjoinを使用することができます:あなたは.上の文字列を分割している

s = "classes.students.grades" 
print '.'.join(s.split('.')[:-1]) 

を - それは、あなたの文字列のリストを与えるでしょう、その後、あなたはそれらを分離する文字列に戻ってリスト要素に参加しています.

[:-1]で最後の後に来るかどうか確認するには

をリストからすべての要素を選ぶが、最後の1になります:

s.split('.')[-1] 

もう一つの方法は、rsplitを使用することです。 分割ように、それは同じように動作しますが、あなたはmaxsplit個パラメータを提供する場合、それは終わりから始まる文字列を分割されます:

rest, last = s.rsplit('.', 1) 

'classes.students' 
'grades' 

あなたはまた、との最後の.後の部分を置換するre.subを使用することができます空の文字列:

re.sub('\.[^.]+$', '', s) 

そして[]内の単語をラップするためにあなたの質問の最後の部分は、私がformatlist comprehensionを使用することをお勧めします:

''.join("[{}]".format(e) for e in s.split('.')) 

それはあなたに必要な出力あげる:'.' in s場合

[classes][students][grades] 
+2

*最後* 'str.rsplit()'または 'str.rpartition()'のどちらかのドット? –

+1

@minitoto:あなたのアプローチは* all *ドットで分割され、追加の ''。 '' join() 'が必要です。 '.rsplit( '。'、1)[0]'を使うか、もっと良い方法として '.rpartition( '。')[0]'を使うと、再度参加することなく必要な結果が得られます。どちらの方法でも最後のドットの後ろにある尾が得られます。 –

+0

s [: - s.find( '。')]を実行して、最後まですべてを取得するのに間違っています。 '最後のドットの後にすべてを得るためにs [s.rfind( '。')+ 1:]を実行しますか? – OriginalCliche

13

を、s.rpartition('.')s
で最後のドットを見つけ、(before_last_dot, dot, after_last_dot)を返します。

s = "classes.students.grades" 
s.rpartition('.')[0] 
15

行うための最善の方法これはrsplitメソッドを使用しており、maxsplit引数を渡します。

>>> s = "classes.students.grades" 
>>> before, after = s.rsplit('.', maxsplit=1) # rsplit('.', 1) in Python 2.x onwards 
>>> before 
'classes.students' 
>>> after 
'grades' 

また、通常のスライス操作でrfind()方法を使用することができます。

は最後 .前にすべてを取得するには、次の

>>> s = "classes.students.grades" 
>>> last_index = s.rfind('.') 
>>> s[:last_index] 
'classes.students' 

そして、すべての後にあなたの目標はただ一桁は、開始と終了の最後の要素を取り除くことであれば.

>>> s[last_index + 1:] 
'grades' 
+5

1つの分割に対して、 'str.rpartition()'はもっと速くなるでしょう。 –

4

最後re.sub()

s = re.sub(r"\.\d$", "", s) 

これは仕事をし、他の文字列だけを残します。他の何かを混乱させる必要はありません。

一度あなたの文字列を分割し、その後、(それが何で、最後のコンポーネントを分離)一般的なケースについて知っrsplitを使用したい場合は、次にはドットがない場合

>>> "hel.lo.there".rsplit(".", 1) 
['hel.lo', 'there'] 

をstringでは、配列内の1つの要素、つまり文字列全体を取得します。

0

rsplit(str.rsplit([sep[, maxsplit]])で非常に簡単に実行できます。これは、指定されたセパレータに沿って各要素を分割してリストを返します。 あなたも実行する必要がありますどのように多くの分割を指定することができます

>>> s = "res.spa.f.sal.786423" 
>>> s.rsplit('.',1) 
['res.spa.f.sal', '786423'] 

だからあなたが記述最後の関数である:あなたがちょうどに分割することができたときに、そんなに仕事をするのはなぜ

def dimimak_cool_function(s): 
    if '.' not in s: return s 
    start, end = s.rsplit('.', 1) 
    return start if end.isdigit() else s 

>>> dimimak_cool_function("res.spa.f.sal.786423") 
'res.spa.f.sal' 
>>> dimimak_cool_function("res.spa.f.sal") 
'res.spa.f.sal' 
+0

この回答は既に与えられた回答とはどのように異なっていますか? – tinySandy

+0

isdigitについて他の回答は実際には答えていません。私は、終わりから終わりまでの答えを提供する唯一のものです。 – DevShark