#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]