使用Python查找与正则表达式的重叠序列

时间:2015-11-05 18:47:19

标签: python regex

我试图提取字符串中的数字以及前后字符(数字和空格除外)。函数的预期返回是元组列表,每个元组具有以下形状:

(previous_sequence, number, next_sequence)

例如:

string = '200gr T34S'
my_func(string)
>>[('', '200', 'gr'), ('T', '34', 'S')]

我的第一次迭代是使用:

def my_func(string):
    res_obj = re.findall(r'([^\d\s]+)?(\d+)([^\d\s]+)?', string)

但是当我传递像'2AB3'这样的字符串时,这个函数没有做我期望的事情我希望输出[('','2','AB'), ('AB','3','')]而是显示[('','2','AB'), ('','3','')],因为& #39; AB'是以前输出的一部分。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

您只需使用+代替修饰符?*

>>> re.findall(r'([^\d\s]*)(\d+)([^\d\s]*)',string)
[('', '200', 'gr'), ('T', '34', 'S')]

但是,如果你想匹配重叠的字符串,你可以使用正向前看来细化所有重叠的匹配:

>>> re.findall(r'(?=([^\d\s]*)(\d+)([^\d\s]*))','2AB3')
[('', '2', 'AB'), ('AB', '3', ''), ('B', '3', ''), ('', '3', '')]

答案 1 :(得分:1)

由于没有重叠的数字,单个尾随
断言应该是你所需要的。

([^\d\s]+)?(\d+)(?=([^\d\s]+)?)

这样的东西

如果你关心这个([^\d\s]*)(\d+)(?=([^\d\s]*)) NULL和空字符串之间的区别。

答案 2 :(得分:0)

另一种方法是使用正则表达式和函数!

import re

#'200gr T34S'  '2AB3'


def s(x):
    tmp=[]
    d = re.split(r'\s+|(\d+)',x)
    d = ['' if v is None else v for v in d] #remove None
    t_ = [i for i in d if len(i)>0]
    digits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
    nms = [i for i in t_ if i[0] in digits]
    for i in nms:       
        if d.index(i)==0:
            tmp.append(('',i,d[d.index(i)+1]))
        elif d.index(i)==len(d):
            tmp.append((d[d.index(i)-1],i,''))
        else:
            tmp.append((d[d.index(i)-1],i,d[d.index(i)+1]))
    return tmp

print s('2AB3')

打印 -

[('', '2', 'AB'), ('AB', '3', '')]