Python Regex搜索具有一个或多个数字的所有子字符串的字符串

时间:2013-04-18 13:56:28

标签: python regex string numbers substring

在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的方法作为我的程序。

4 个答案:

答案 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