正则表达式 - python 2.6和3.3中的不同输出

时间:2013-02-08 08:58:13

标签: python regex

当我为正则表达式执行相同的代码时,我在python 2和3中获得了不同的输出。

假设这是我想要的数据,它位于网页的某个位置。

source = ['\x1e\x1e5.5.30-log\x1epcofiowa@localhost\x1epcofiowa_pci\x1e',
          '\x1e\x1e5.5.30-log\x1epcofiowa@localhost\x1epcofiowa_pci\x1e', 
          '\x1e\x1e5.5.30-log\x1epcofiowa@localhost\x1epcofiowa_pci\x1e', 
          '\x1e\x1e5.5.30-log\x1epcofiowa@localhost\x1epcofiowa_pci\x1e']

因此,当我在python 2.6中运行以下代码时,它完美无缺。我得到的确切输出如上所述。

match = re.findall("\x1e\x1e\S+",source)

但是当我在python 3.3中执行它时,如:

match = re.findall("\x1e\x1e\S+", str(source))

我得到匹配变量的输出,如:

['\x1e\x1e5.5.30-log', '\x1e\x1e5.5.30-log', '\x1e\x1e5.5.30-log','\x1e\x1e5.5.30-log']

那么,请你告诉我为什么它没有在python 3中使用整个字符串?为什么每次都跳过\x1epcofiowa@localhost\x1epcofiowa_pci\x1e?我想输出像python 2.6。

所以,此刻我很无能为力。我在等待你的答复。感谢。

1 个答案:

答案 0 :(得分:3)

\SPython 2中的Python 3似乎有所不同。

根据Python 3 re module docs: -

  

\S - 匹配任何不是Unicode空格的字符   字符。这与\s相反。如果使用ASCII flag   变得相当于[^ \t\n\r\f\v](但是国旗会影响到。{1}}   整个正则表达式,所以在这种情况下使用显式[^ \t\n\r\f\v]可能是更好的选择。)

现在,由于\x1e(相当于U+001E,因为\x1e\x1e5.5.30-log是一个unicode whitespace字符 - reference to activestate,所以它不匹配Python 3中的\S


而在Python 2: -

  

\S - 匹配任何非空白字符;这相当于   班[^ \t\n\r\f\v]

因此,它仅考虑用于匹配非空格的ASCII字符集,因此它与\x1e匹配。