| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 
 | #!/usr/bin/python
# -*- coding: utf-8 -*- 
 
import re
 
digits = '0123456789'
#letters = 'abcdefghijklmnopqrstuvwxyz' + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
 
description = "(15, S, 25), (7, c, 4), (15, S, 25), (9, d, 3), (8, b, 4) "
patterns = ["13, S, 22", "8, b, 4"]
print "description=", description
print "patterns=", patterns
 
regexStringTemp = ""
regexString = ""
 
def generateRegexStringInt(val):
  regexStringPart =""
  if val <10: 
    threshold=1
  else:
    threshold = int(repr(val)[:-1]) +1 # delete unity: 16-> 1+1, 57-> 5+1, 234-> 23+1
  for i in range(val-threshold, val+threshold+1):
    regexStringPart = regexStringPart + str(i)  +"|"
  return regexStringPart[:-1]
 
def generateRegexStringLetter(val):
  if val in 'TLSVN':
    return val
  else:
    return chr(ord(val)-1) +"|"+ val +"|"+ chr(ord(val)+1)
 
for pattern in patterns:
  values = pattern.split(", ")
  if values[0][0] in digits:
    part1 = generateRegexStringInt(int(values[0]))
  else:
    part1 = generateRegexStringLetter(values[0])
  if values[1][0] in digits: 
    part2 = generateRegexStringInt(int(values[1]))
  else:
    part2 = generateRegexStringLetter(values[1])
  if values[2][0] in digits:
    part3 = generateRegexStringInt(int(values[2]))
  else:
    part3 = generateRegexStringLetter(values[2])
 
  regexStringPart1 = "\((" + part1 
  regexStringPart1 = regexStringPart1 + "), ("
 
  regexStringPart3 = "), (" + part3
  regexStringPart3 = regexStringPart3 +")\)"
 
  #regexStringPart2 = "), ("+ str(val2 -1) +"|"+ str(val2) +"|"+ str(val2 +1) +")\)"
 
  regexString = regexString + regexStringPart1 + part2 + regexStringPart3 + ".*" 
 
regexString = regexString[:-2]  #remove the last  ','
print "regexString="+regexString 
 
listNear= []
regexPat = re.compile(regexString)			#regexPat = re.compile("\(15, S, 25\),(?<=.*)\(15, b, 2\)")	
listNear.extend(re.findall(regexPat, description))		#regexPat = re.compile(regexString)
print "listNear"+str(listNear)
 
for near in listNear:
  lapin = "("+ str(list(near))[1:-1] +") "
  print "lapin"+lapin  
 
# lapin('15', 'S', '25', '8', 'b', '4')
# je voudrais les 2 solutions possibles:  (15, S, 25), (7, c, 4) et (15, S, 25),  (8, b, 4) ce dernier étant séparé par (9, d, 3) que je n'ai pas besoin de conserver.
 
teststr = []
for near in listNear:
  tmp = "".join("[")
  for n in range(0, len(near), 3):
    tmp = tmp + "("+ near[n] +", "+ near[n+1] +", "+ near[n+2] +")"
  tmp = tmp +  "]"
  teststr.append(tmp)
print "teststr=",teststr
 
# teststr= ['[(15, S, 25)(8, b, 4)]']
# Je voudrais de même ici trouvé les 2 solutions possibles. |