Python 查找字符串中第一个数字的索引
我有一根像Python 查找字符串中第一个数字的索引,python,regex,string,Python,Regex,String,我有一根像 "xdtwkeltjwlkejt7wthwk89lk" 如何获取字符串中第一个数字的索引?正如其他解决方案所说,要查找字符串中第一个数字的索引,我们可以使用正则表达式: >>> s = 'xdtwkeltjwlkejt7wthwk89lk' >>> match = re.search(r'\d', s) >>> print match.start() if match else 'No digits found' 15 >
"xdtwkeltjwlkejt7wthwk89lk"
如何获取字符串中第一个数字的索引?正如其他解决方案所说,要查找字符串中第一个数字的索引,我们可以使用正则表达式:
>>> 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
import re
my_string = "xdtwkeltjwlkejt7wthwk89lk"
if first_digit := re.search(r"\d", my_string):
print(first_digit.start())
如果我们想将问题扩展到查找第一个整数(不是数字)以及它是什么:
>>> 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
>>s='xdtwkeltjwlkejt711wthwk89lk'
>>>对于枚举中的i、c:
... 如果c.isdigit():
... 开始=i
... 而i
我确信有多种解决方案,但使用正则表达式可以做到这一点:
>>> import re
>>> match = re.search("\d", "xdtwkeltjwlkejt7wthwk89lk")
>>> match.start(0)
15
可以使用正则表达式
import re
y = "xdtwkeltjwlkejt7wthwk89lk"
s = re.search("\d",y).start()
使用:
这里有一个更好、更灵活的方法,正则表达式在这里是多余的
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')]
或者,您可以创建数字及其最后位置的dict
>>> {c: i for i, c in enumerate('xdtwkeltjwlkejt7wthwk89lk') if c.isdigit()}
{'9': 22, '8': 21, '7': 15}
对于解析器来说,这似乎是一项不错的工作:
>>> 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]
>>来自simpleparse.parser导入解析器
>>>s='xdtwkeltjwlkejt7wthwk89lk'
>>>语法=”“
…整数:=[0-9]+
…:=-整数+
…全部:=(整数/α)+
... """
>>>parser=parser(语法“all”)
>>>parser.parse(s)
(1,[('integer',15,16,无),('integer',21,23,无)],25)
>>>解析器中x的[int(s[x[1]:x[2]])。parse(s)[1]]
[7, 89]
这里是另一种少正则表达式的方式,更多的是函数式的。这个函数找到字符串中每个数字第一次出现的位置,然后选择最低的数字。正则表达式可能会更有效,特别是对于较长的字符串(这使得至少10次完整的字符串传递,最多20次)
我想我会把我的方法扔掉。我会尽一切努力避免正则表达式
sequence = 'xdtwkeltjwlkejt7wthwk89lk'
i = [x.isdigit() for x in sequence].index(True)
要解释这里发生了什么:
将把字符串转换成一个布尔数组,表示每个字符是否为数字[x.isdigit()表示序列中的x]
返回在中找到的第一个索引值[…].index(True)
True
90
这不使用正则表达式,一旦找到第一个数字就会停止迭代。要获取所有索引,请执行以下操作:
idxs = [i for i in range(0, len(string)) if string[i].isdigit()]
然后,要获取第一个索引,请执行以下操作:
if len(idxs):
print(idxs[0])
else:
print('No digits exist')
在Python 3.8+中,您可以使用查找第一个
\d
(对于digit)字符类,如下所示:
>>> for i, c in enumerate(s):
... if c.isdigit():
... print i
... break
...
15
import re
my_string = "xdtwkeltjwlkejt7wthwk89lk"
if first_digit := re.search(r"\d", my_string):
print(first_digit.start())
输出:
12
numidx
将是instr
中第一个数字出现的索引。如果instr
中没有数字,numidx
将是None
我在这里没有看到这个解决方案,我认为应该是这样。您可以在匹配对象中找到位置。看看我的解决方案。这肯定是过火了,但这是一个很好的食谱@jsbueno:谢谢,这确实是一个过激的回答(至少在你必须扩展模式匹配之前,有时我很难理解我两个月前写的正则表达式):-)这个回答教会了我更多关于如何使用simpleparse的知识,而不是任何教程。如果有人对性能感兴趣,我在一些不同的方法上做了一些工作-正则表达式是最快的:为了得到找到的数字(在本例中为4),您将使用什么来代替
m.start()
。@zanahorias您可以使用m.group(0)
自从@umbrae的基准测试以来已经很长时间了,目前在Python 3.7.8上,isdigit()对于我来说,方法的速度总是快大约5-6%。请考虑在答案中添加一个简短的代码解释。不仅仅是第一个数字。这仅在最后一个字符是数字时才有效。如果字符串没有数字,则会引发ValueError
。如果字符串没有数字,则会引发indexer
。一行式更好<如果您的字符串没有任何数字,则会引发代码>AttributeError
。AttributeError
如果您的字符串没有任何数字,则会引发。我不确定您是如何错过它的,但这与。
if len(idxs):
print(idxs[0])
else:
print('No digits exist')
import re
my_string = "xdtwkeltjwlkejt7wthwk89lk"
if first_digit := re.search(r"\d", my_string):
print(first_digit.start())
instr = 'nkfnkjbvhbef0njhb h2konoon8ll'
numidx = next((i for i, s in enumerate(instr) if s.isdigit()), None)
print(numidx)
12