1

正規表現で同じコードを実行すると、Python 2 と 3 で異なる出力が得られます。

これが、Web ページのどこかにある必要なデータであるとします。

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 のような出力が必要です。

ですから、現時点では私は無知です。お返事を待っております。ありがとう。

4

1 に答える 1

3

\Sでは動作が異なるようです。Python 2Python 3

Python 3 reモジュールドキュメントによると: -

\S- Unicode 空白文字以外の任意の文字に一致します。これは の反対です\s。が使用されている場合、ASCII flagこれは と同等になります[^ \t\n\r\f\v](ただし、フラグは正規表現全体に影響するため、そのような場合は明示的に使用する[^ \t\n\r\f\v]方が適切な場合があります)。

現在、\x1e(と同等U+001Eの , は your \x1e\x1e5.5.30-logis a unicode whitespacecharacter - reference to activestate\Sの後に来るため、Python 3 では一致しません。


一方、Python 2 では: -

\S- 空白以外の任意の文字に一致します。これは class と同等[^ \t\n\r\f\v]です。

ASCIIしたがって、空白以外に一致する文字セットのみが考慮されるため、一致し\x1eます。

于 2013-02-08T09:16:24.200 に答える