在python中,我有以下字符串:
"fish 14~ reel 14 rod B14"
我想使用REGEX来运行for循环并返回其中包含一个或多个数字的每个子字符串的位置。例:
For ():
print location of substring
我的期望输出是:
5
14
21
请帮助,谢谢。
解答: 好的,我测试了以下所有内容,它们都有效。哪一个最快?鼓滚......从最快到最慢: 1)Perreal - 9.7ms 2)Jon - 10.5ms 3)m.buettner - 12.3ms 4)upasana - 25.6ms
感谢各位Python天才。有另一个解决方案,但我没有测试它。由于其他各种原因,我选择了Jon的方法作为我的程序。
答案 0 :(得分:3)
类似的东西:
s = "fish 14~ reel 14 rod B14"
import re
words = re.finditer('\S+', s)
has_digits = re.compile(r'\d').search
print [word.start() for word in words if has_digits(word.group())]
# [5, 14, 21]
所以,有效地找到单词开头的索引,然后检查每个单词以查看它是否有数字...
如果确实最后一个条目应该是22而不是21,那么你已经有了可能重复的答案......
答案 1 :(得分:0)
试试这个
import re
s = "fish 14~ reel 14 rod B14"
p = re.compile('[0-9]+')
a = p.findall(s)
print a
获得职位
for m in re.finditer(r'([a-zA-Z]+)?[0-9]+', s):
st, en = m.span()
print "position ", st, en, " string ", s[st:en]
你应该看到
位置5 7弦14
位置14 16弦14
位置21 24字符串B14
这是正确的!
答案 2 :(得分:0)
您也可以不使用正则表达式执行此操作:
p = list()
for i in [ i for i,c in enumerate(str) if c.isdigit() ]:
if len(p) == 0 or p[-1] + 1 != i:
p.append(i)
print p
但这会给你数字的起始位置,这些数字不会紧接在另一个数字之前。向后弯曲使这完成:
p = list()
for i in [ i for i,c in enumerate(str) if c.isdigit() ]:
if i > 0 and not str[i - 1].isdigit():
while i > 0 and str[i - 1].isalnum():
i -= 1
p.append(i)
print p
答案 3 :(得分:0)
试试这个:
#!/usr/bin/env python
import re
str = "fish 14~ reel 14 rod B14"
index = 0
for x in str.split(" "):
if re.search('\d', x):
print(max(str.find(x), index))
index += len(x) + 1
<强>输出:强>
5
14
21