用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)这样的一行代码也比较干净,我认为它更干净。