Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python查找正则表达式的重叠序列_Python_Regex - Fatal编程技术网

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

用Python查找正则表达式的重叠序列,python,regex,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(

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

(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','')
,因为'AB'是前面输出的一部分


如何修复此问题?

而不是修饰符
+
您只需使用
*

>>> 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', '')]

因为没有重叠的数字,所以只有一个尾随的
断言应该是您所需要的全部

类似于
([^\d\s]+)?(\d+)(=([^\d\s]+)?)

如果您关心

空字符串和空字符串之间的区别。

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

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', '')]

看起来很有效,谢谢!秘密是*?Kasramvd实际上我需要'2AB3'的输出是[('2','AB'),('AB','3',''),没有所有其他重叠匹配。你能帮我吗?在你的最后一句话中,你的意思是“如果你不在乎”?@NiklasB这是一个很难回答的问题,我不知道,可能会有任何结果。你可以检查另一个答案和反馈!谢谢,似乎可以完成这项工作,但是像
re.findall(r'([^\d\s]+)?(\d+)(=([^\d\s]+)?),string)这样的一行代码也比较干净,我认为它更干净。