簡體   English   中英

查找字符串中第一個數字的索引

[英]Find the index of the first digit in a string

我有一個像

"xdtwkeltjwlkejt7wthwk89lk"

如何獲取字符串中第一個數字的索引?

使用re.search()

>>> import re
>>> s1 = "thishasadigit4here"
>>> m = re.search(r"\d", s1)
>>> if m:
...     print("Digit found at position", m.start())
... else:
...     print("No digit in that string")
... 
Digit found at position 13

這是一種更好、更靈活的方法,正則表達式在這里有點矯枉過正。

s = 'xdtwkeltjwlkejt7wthwk89lk'

for i, c in enumerate(s):
    if c.isdigit():
        print(i)
        break

輸出:

15

要獲取所有數字及其位置,一個簡單的表達式就可以了

>>> [(i, c) for i, c in enumerate('xdtwkeltjwlkejt7wthwk89lk') if c.isdigit()]
[(15, '7'), (21, '8'), (22, '9')]

或者您可以創建一個數字字典及其最后位置

>>> {c: i for i, c in enumerate('xdtwkeltjwlkejt7wthwk89lk') if c.isdigit()}
{'9': 22, '8': 21, '7': 15}

以為我會把我的方法扔在堆上。 我會做任何事情來避免正則表達式。

sequence = 'xdtwkeltjwlkejt7wthwk89lk'
i = [x.isdigit() for x in sequence].index(True)

解釋這里發生了什么:

  • [x.isdigit() for x in sequence]將字符串轉換為布爾數組,表示每個字符是否為數字
  • [...].index(True)返回找到True的第一個索引值。
import re
first_digit = re.search('\d', 'xdtwkeltjwlkejt7wthwk89lk')
if first_digit:
    print(first_digit.start())

對於解析器來說似乎是一份不錯的工作:

>>> from simpleparse.parser import Parser
>>> s = 'xdtwkeltjwlkejt7wthwk89lk'
>>> grammar = """
... integer := [0-9]+
... <alpha> := -integer+
... all     := (integer/alpha)+
... """
>>> parser = Parser(grammar, 'all')
>>> parser.parse(s)
(1, [('integer', 15, 16, None), ('integer', 21, 23, None)], 25)
>>> [ int(s[x[1]:x[2]]) for x in parser.parse(s)[1] ]
[7, 89]

要獲取所有索引,請執行以下操作:

idxs = [i for i in range(0, len(string)) if string[i].isdigit()]

然后獲取第一個索引:

if len(idxs):
    print(idxs[0])
else:
    print('No digits exist')

正如其他解決方案所說,要找到字符串中第一個數字的索引,我們可以使用正則表達式:

>>> s = 'xdtwkeltjwlkejt7wthwk89lk'
>>> match = re.search(r'\d', s)
>>> print match.start() if match else 'No digits found'
15
>>> s[15] # To show correctness
'7'

雖然簡單,但正則表達式匹配對於超長字符串來說有點過分了。 一種更有效的方法是像這樣遍歷字符串:

>>> for i, c in enumerate(s):
...     if c.isdigit():
...         print i
...         break
... 
15

如果我們想將問題擴展到查找第一個整數(不是數字)及其內容:

>>> s = 'xdtwkeltjwlkejt711wthwk89lk'
>>> for i, c in enumerate(s):
...     if c.isdigit():
...         start = i
...         while i < len(s) and s[i].isdigit():
...             i += 1
...         print 'Integer %d found at position %d' % (int(s[start:i]), start)
...         break
... 
Integer 711 found at position 15

Python 3.8+ 中,您可以使用re.search來查找第一個\d 對於數字)字符類,如下所示:

import re

my_string = "xdtwkeltjwlkejt7wthwk89lk"

if first_digit := re.search(r"\d", my_string):
    print(first_digit.start())

我確定有多種解決方案,但使用正則表達式可以做到這一點:

>>> import re
>>> match = re.search("\d", "xdtwkeltjwlkejt7wthwk89lk")
>>> match.start(0)
15

這是另一種無正則表達式的方式,更多的是函數式風格。 這個找到字符串中存在的每個數字第一次出現的位置,然后選擇最低的。 正則表達式可能會更有效,尤其是對於較長的字符串(這至少使字符串完整傳遞 10 次,最多 20 次)。

haystack = "xdtwkeltjwlkejt7wthwk89lk"
digits   = "012345689"
found    = [haystack.index(dig) for dig in digits if dig in haystack]
firstdig = min(found) if found else None
import re
result = "  Total files:...................     90"
match = re.match(r".*[^\d](\d+)$", result)
if match:
    print(match.group(1))

將輸出

90
def first_digit_index(iterable):
    try:
        return next(i for i, d in enumerate(iterable) if d.isdigit())
    except StopIteration:
        return -1

這不使用正則表達式,一旦找到第一個數字就會停止迭代。

你可以使用正則表達式

import re
y = "xdtwkeltjwlkejt7wthwk89lk"

s = re.search("\d",y).start()
instr = 'nkfnkjbvhbef0njhb h2konoon8ll'
numidx = next((i for i, s in enumerate(instr) if s.isdigit()), None)
print(numidx)

輸出:

12

numidx將是instr中第一次出現的數字的索引。 如果instr中沒有數字, numidx將為None

我沒有在這里看到這個解決方案,並認為它應該是。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM