Здравствуйте, я пытаюсь получить следующую строку из файла
neighbors= {5 7 9 11 13 14 15 16 17 }
Шаблон {number1 number2... }
меняется, некоторые из них короткие, некоторые из них слишком длинны. Я хочу найти такую картину. Моя логика заключается в том, чтобы получить оператор "neighbors= {"
, за которым следует число и пробел в качестве повторения, пока программа не найдет последние закрытые фигурные скобки. Может ли кто-нибудь помочь мне с синтаксисом?
Спасибо
Я думаю, вы ищете это:
import re
FOO = """neighbors= {5 7 9 11 13 14 15 16 17 }"""
match = re.search('(neighbors\s*=\s*\{\s*(\d+\s*)+\})', FOO)
print match.group(1)
Регулярное выражение переносимо, конечно, на многие языки.
Запуск, который дает...
neighbors= {5 7 9 11 13 14 15 16 17 }
Но регулярное выражение будет соответствовать произвольному числу цифр в фигурных скобках.
Обозначение с помощью re.findall()
и re.compile()
...
import re
FOO = """neighbors= {5 7 9 11 13 14 15 16 17 }"""
COMPILE = re.compile('(neighbors\s*=\s*\{\s*(\d+\s*)+\})')
match = re.findall(COMPILE, FOO)
print match[0]
Запуск второго кода возвращается...
neighbors= {5 7 9 11 13 14 15 16 17 }
Хотя вы должны помнить, что .findall()
предназначался для нескольких вхождений соответствия регулярных выражений внутри целевой строки. Приведенные примеры не иллюстрируют необходимости .findall()
.findall()
помните, что он возвращает список строк вместо объекта re
соответствия. Нет проблем с использованием этого регулярного выражения с .compile()
или .findall()
если вы понимаете конкретные возвращаемые значения, .findall()
от каждой функции.
Я бы взял всю строку со словом "соседи" в нем, вытащил строку между фигурными скобками, разделил по пробелам, а затем у меня был бы массив строк, который можно преобразовать в целые числа
вот о чем вы просили:
neighbors= \{ (\d+ )+\}
делает его более терпимым к некоторым дополнительным пространствам вокруг {} brakets:
neighbors= ?\{ ?(\d+ )+(\}|\d+\})
или более короткий:
neighbors\s*=\s*\{[\d\s]+\}