2010-03-17 137 views
0

我有数据通过套接字进入python服务器。在这个数据中是字符串'<port>80</port>'或者哪个端口正在被使用。Python:从套接字数据匹配和剥离端口号

我希望将端口号提取到变量中。进来的数据不是XML,我只是使用标记方法来识别未来XML使用的数据(如果需要的话)。我不希望使用XML python库,而只是使用诸如regexp和字符串之类的东西。

你会推荐什么是匹配和去除这些数据的最佳方法?

我目前使用此代码,没有运气:

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

谢谢:)

回答

1

正则表达式不能解析XML,不应该被用来解析 XML。您应该执行以下任一操作:

  • 使用更好的序列化方法,比如JSON或带有ConfigParser模块的ini文件。
  • 真正使用XML而不是只是有些看起来像XML和真正喜欢的东西lxml.etree解析它
  • 如果这是整个配置,只需将该数字存储在文件中。这个解决方案并不比使用JSON或其他东西容易,但它比现在的更好。

现在为未来的需求实施一个不好的解决方案,你无法定义或精确预测总是一个不好的方法。你会保持忙碌,试图编写和维护软件现在,没有充分的理由去满足未来未知的需求。我从来没有见过一个“我会在稍后放置”的案例,这导致了后来更少的头痛,特别是当我通过做一些完全错误的事情来解决问题时。 YAGNI!

至于你的片段有什么问题,而不是使用完全错误的方法,角括号在正则表达式中有意义。

0

虽然迈克·格雷厄姆是正确的,使用不“推荐”的正则表达式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) 

(注意是完全没有错误检查,即作为练习留给用户)

+0

这是否工作取决于关于文件gazillion事情。 – 2010-03-17 20:00:39

+0

不是真的,他拥有这段代码的所有部分,他可以让它做任何想做的事情。我了解不使用xml解析器来处理'看起来像'xml的东西的恐惧。我也明白OP的意思是不想为这一点点而牺牲一个xml引擎。正则表达式对他的问题工作得很好。 – KevinDTimm 2010-03-18 14:37:38