Python: соответствие и удаление номера порта из данных сокета - PullRequest
0 голосов
/ 17 марта 2010

У меня есть данные, поступающие на сервер Python через сокет. В этих данных есть строка '<port>80</port>' или какой порт используется.

Я хочу извлечь номер порта в переменную. Входящие данные не являются XML, я просто использовал подход с использованием тегов для определения данных для будущего использования XML, если это необходимо. Я не хочу использовать библиотеку XML Python, а просто использовать что-то вроде регулярных выражений и строк.

Что бы вы посоветовали, это лучший способ сопоставить и вырезать эти данные?

Я сейчас использую этот код без удачи:

p = re.compile('<port>\w</port>')
m = p.search(data)
print m

Спасибо:)

Ответы [ 2 ]

1 голос
/ 17 марта 2010

Regex не может анализировать XML и не должен использоваться для анализа fake XML.Вам следует выполнить одно из следующих действий:

  • . Использовать метод сериализации, с которым лучше начать работу, например JSON или INI-файл с модулем ConfigParser.
  • На самом деле используйте XML , а не то, что выглядит как XML, и действительно анализирует его с чем-то вроде lxml.etree.
  • Просто сохраните число в файле, если этовся ваша конфигурация.Это решение на самом деле не проще, чем просто использование JSON или чего-то еще, но оно лучше, чем текущее.

Реализация плохого решения для будущих нужд, которое вы не можете определить или точно предсказать,всегда плохой подход.Вы будете достаточно заняты, пытаясь написать и поддерживать программное обеспечение сейчас , что нет веских оснований пытаться удовлетворить неизвестные будущие потребности.Я никогда не видел случая, чтобы «Я вставлю это на потом» приводил к меньшей головной боли в дальнейшем, особенно когда я делал это, делая что-то совершенно не так.YAGNI!

Что касается того, что не так с вашим фрагментом, кроме использования совершенно неправильного подхода, угловые скобки имеют значение в регулярном выражении.

0 голосов
/ 17 марта 2010

Хотя Майк Грэм и прав, использование регулярных выражений для xml не «рекомендуется», будет работать следующее:

(I have defined searchType as 'd' for numerals)
searchStr = 'port'

if searchType == 'd':
    retPattern = '(<%s>)(\d+)(</%s>)'
else:
    retPattern = '(<%s>)(.+?)(</%s>)'

searchPattern = re.compile(retPattern % (searchStr, searchStr))
found = searchPattern.search(searchStr)
retVal = found.group(2)

(обратите внимание на полное отсутствие проверки ошибок, оставленное пользователю в качестве упражнения)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...