Ошибка атрибута: у Nonetype нет атрибута ‘group’

#python #regex #attributeerror #nonetype

#python #регулярное выражение #ошибка атрибута #nonetype

Вопрос:

 Traceback (most recent call last):
File "redact.py", line 100, in <module>
match = int(re.match(r'd ', number).group())
AttributeError: 'NoneType' object has no attribute 'group' 
  

ввод = (1, 2)(5, 2)(14, 2)(17, 2)(1, 3)(5, 3)(14, 3)(17, 3)(1, 4)(5, 4)(8, 4)(9, 4)(10, 4)(11, 4)(14, 4)(17, 4)(20, 4)(21, 4)(22, 4)(23, 4)(1, 5)(2, 5)(3, 5)(4, 5)(5, 5)(8, 5)(9, 5)(10, 5)(11, 5)(14, 5)(17, 5)(20, 5)(21, 5)(22, 5)(23, 5)(1, 6)(5, 6)(8, 6)(9, 6)(10, 6)(11, 6)(14, 6)(17, 6)(20, 6)(23, 6)(1, 7)(5, 7)(8, 7)(9, 7)(14, 7)(17, 7)(20, 7)(21, 7)(22, 7)(23, 7)(1, 8)(5, 8)(8, 8)(9, 8)(10, 8)(11, 8)(14, 8)(17, 8)(20, 8)(21, 8)(22, 8)(23, 8)

вывод = >>> ошибка выше Это сообщение об ошибке, которое я получаю после выполнения следующего кода:

 xcoord = []
regex = ur"b[0-9,]{1,}[,]sb"  #regex for x coordinates
result = re.findall(regex,str1)

for number in result: #get x numbers from coordinate
    match = int(re.match(r'd ', number).group())
    xcoord.append(match) #now got array of numbers for x    
maxValueX = max(xcoord) #biggest x value

ycoord = []
regex = ur"b[,]s[0-9,]{1,}b" #regex for y coordinates
result = re.findall(regex,str1)

for number in result: #get y numbers from coordinate
    match = int(re.match(r'd ', number).group())
    ycoord.append(match) #now got array of numbers for y
maxValueY = max(ycoord) #biggest y value

print maxValueX 
print maxValueY
  

Строка, по которой выполняется поиск, является: «5′, ‘, 5’, ‘, 6’, ‘, 3’,». В двух разных онлайн-генераторах регулярных выражений приведенное выше регулярное выражение отлично работает для строки. Почему он работает для координаты X, но НЕ для Y? Код точно такой же!

(Кстати, я пытаюсь получить целые числа из строки).

Спасибо

Комментарии:

1. Кстати, если кто-нибудь спросит, первое регулярное выражение Y или X идеально и работает, это второе с .group(), которое вызывает проблему.

2. Как это «чрезвычайно странно [так в оригинале]» ? Очевидно, match для этого pattern нет в number — почему бы и нет print number и выяснить, почему?

3. -1 Конечно, вы не можете предоставить полную программу, которая демонстрирует проблему. Таким образом, у нас действительно есть ваши входные данные. Очевидно, re.match() вернулся None . Но ваша программа зависит от ее входных данных. Который вы не предоставили.

4. re.match() возвращает None для некоторых случаев

5. «номер печати» выдает «, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4», регулярное выражение ‘ d ‘ должно найти числа no?

Ответ №1:

Регулярное выражение не требуется:

 str1 = "(8, 5)(9, 5)(10, 5)(11, 5)(14, 5)(17, 5)(20, 5)(21, 5)(22, 5)(23, 5)(1, 6)(5, 6)(8, 6)(9, 6)(10, 6)(11, 6)(14, 6)(17, 6)(20, 6)(23, 6)(1, 7)(5, 7)(8, 7)(9, 7)(14, 7)(17, 7)(20, 7)(21, 7)(22, 7)(23, 7)(1, 8)(5, 8)(8, 8)(9, 8)(10, 8)(11, 8)(14, 8)(17, 8)(20, 8)(21, 8)(22, 8)(23, 8)"

xcoord = [int(element.split(",")[0].strip()) for element in str1[1:-1].split(")(")]
ycoord = [int(element.split(",")[1].strip()) for element in str1[1:-1].split(")(")]

maxValueX = max(xcoord); maxValueY = max(ycoord)
print maxValueX;
print maxValueY;
  

Комментарии:

1. отлично, работает и сокращает мой код! вы, сэр, заработали зеленую галочку

Ответ №2:

Каково содержимое переменной str1 ???

re.match(r'd ', number) возвращается, None поскольку number не соответствует вашему регулярному выражению, просмотрите содержимое переменной, result от str1 которой зависит.

Каждое регулярное выражение должно быть протестировано шаг за шагом, попробуйте какой-нибудь веб-инструмент для регулярных выражений, подобный этому, чтобы протестировать их.

Измените ваше регулярное выражение на: regex = "b([0-9] ),sb"

Комментарии:

1. str1 = (8, 5)(9, 5)(10, 5)(11, 5)(14, 5)(17, 5)(20, 5)(21, 5)(22, 5)(23, 5)(1, 6)(5, 6)(8, 6)(9, 6)(10, 6)(11, 6)(14, 6)(17, 6)(20, 6)(23, 6)(1, 7)(5, 7)(8, 7)(9, 7)(14, 7)(17, 7)(20, 7)(21, 7)(22, 7)(23, 7)(1, 8)(5, 8)(8, 8)(9, 8)(10, 8)(11, 8)(14, 8)(17, 8)(20, 8)(21, 8)(22, 8)(23, 8), Я пытаюсь получить значение X как первое число в скобках, а Y как второе, в отдельные массивы в виде целых чисел.

2. Измените ваше регулярное выражение на: regex = » b ([0-9] ) , s b»

3. Я использовал этот точный веб-инструмент regex для строк, которые я предоставил, str1 И result, и он по-прежнему выдает ошибку.

4. juankysmith — ваше решение соответствует точно такому же, как у меня. в любом случае спасибо

5. Нет, ваш включает «,»

Ответ №3:

Это создаст два списка, один со всеми первыми элементами, а другой со всеми вторыми.

 x_cord = map(int,re.findall("(?<=()d ",str1))

y_cord= map(int,re.findall("(?<=,s)d ",str1))
x_cord
 [8, 9, 10, 11, 14, 17, 20, 21, 22, 23, 1, 5, 8, 9, 10, 11, 14, 17, 20, 23, 1, 5, 8, 9, 14, 17, 20, 21, 22, 23, 1, 5, 8, 9, 10, 11, 14, 17, 20, 21, 22, 23]

y_cord  
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8]