繁体   English   中英

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

[英]regular expression - different output in python 2.6 and 3.3

当我为正则表达式执行相同的代码时,我在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跳过\\x1epcofiowa@localhost\\x1epcofiowa_pci\\x1e 我想输出像python 2.6。

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

看起来像\\SPython 2Python 3表现不同。

根据Python 3 re模块文档 : -

\\S - 匹配任何不是Unicode空白字符的字符。 这与\\s相反。 如果使用ASCII flag则它变为等同于[^ \\t\\n\\r\\f\\v] (但是该标志会影响整个正则表达式,所以在这种情况下使用显式[^ \\t\\n\\r\\f\\v]可能是更好的选择)。

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


而在Python 2中 : -

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM