8

シナリオ:

>>> a='   Hello world'
index = 3

この場合、「H」インデックスは「3」です。しかし、文字列変数 'a' が最初の文字のインデックスを知る必要があるような、より一般的な方法が必要ですか?

別のシナリオ:

>>> a='\tHello world'
index = 1
4

5 に答える 5

8

最初の非空白文字を意味する場合は、次のようなものを使用します...

>>> a='   Hello world'
>>> len(a) - len(a.lstrip())
3

少し楽しい別のもの:

>>> sum(1 for _ in itertools.takewhile(str.isspace,a))
3

しかし、C でのみ、本質的にこの正確なループを行うため、最初のバージョンの方が高速であることに賭けても構わないと思っています。もちろん、完了したら新しい文字列を構築する必要がありますが、それは本質的に無料です。


完全を期すために、文字列が空であるか、完全に空白で構成されている場合、これらの両方が返さlen(a)れます(これでインデックスを作成しようとすると無効になります...)

>>> a = "foobar"
>>> a[len(a)]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range
于 2013-06-13T14:09:37.657 に答える
3

使用regex:

>>> import re
>>> a='   Hello world'
>>> re.search(r'\S',a).start()
3
>>> a='\tHello world'
>>> re.search(r'\S',a).start()
1
>>>

文字列が空であるか空白のみを含む場合を処理する関数:

>>> def func(strs):
...     match = re.search(r'\S',strs)
...     if match:
...         return match.start()
...     else:
...         return 'No character found!'
...     
>>> func('\t\tfoo')
2
>>> func('   foo')
3
>>> func('     ')
'No character found!'
>>> func('')
'No character found!'
于 2013-06-13T14:11:06.517 に答える
2

あなたも試すことができます:

a = '   Hello world'
a.index(a.lstrip()[0])
=> 3

文字列に少なくとも 1 つの非スペース文字が含まれている限り、機能します。もう少し注意して、前にこれを確認できます。

a = '    '
-1 if not a or a.isspace() else a.index(a.lstrip()[0])
=> -1
于 2013-06-13T14:14:44.713 に答える
1

楽しみのための別の方法... 特別な機能を使用してください!

>>> def first_non_space_index(s):
    for idx, c in enumerate(s):
        if not c.isspace():
            return idx


>>> a = '   Hello world'        
>>> first_non_space_index(a)
3
于 2013-06-13T14:17:13.730 に答える
0

mgilsonの回答に従って、lstripを使用して、必要な文字を削除できます-

unwanted = ':!@#$%^&*()_+ \t\n'
a= '  _Hello world'
res = len(a) - len(a.lstrip(unwanted)) 
于 2013-06-13T14:19:34.203 に答える