当我为正则表达式执行相同的代码时,我在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。
所以,此刻我很无能为力。我在等待你的答复。感谢。
答案 0 :(得分:3)
\S
和Python 2
中的Python 3
似乎有所不同。
\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
匹配。