我试图提取字符串中的数字以及前后字符(数字和空格除外)。函数的预期返回是元组列表,每个元组具有以下形状:
(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'是以前输出的一部分。
我该如何解决这个问题?
答案 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', '')]