2

コードの反復#2

stringVar = r'string'うまく機能したを使用してvar1を生の文字列に変更します。以下のコードで、次の例外が発生します。

Traceback (most recent call last):
  File "regex_test.py", line 8, in <module>
    pattern = re.compile(var2 + "(.*)")
  File "/usr/lib/python2.7/re.py", line 190, in compile
    return _compile(pattern, flags)
  File "/usr/lib/python2.7/re.py", line 242, in _compile
    raise error, v # invalid expression
sre_constants.error: unbalanced parenthesis

-

#!/usr/bin/python

import re

var1 = r'\\some\String\to\Match'
var2 = '\\\\some\\String\\'

pattern = re.compile(var2 + "(.*)")
found = pattern.match(var1, re.IGNORECASE)

if found:
    print "YES"
else:
    print "NO"

正規表現に変数を含めようとしています。この質問はこの他の質問に関連していますが、コンパイルされたパターンと一致内の変数を使用することによってわずかに異なります。私が読んだすべてによれば、以下のサンプルコードは機能するはずです。

#!/usr/bin/python

import re

var1 = re.escape('\\some\String\to\Match') # A windows network share
var2 = "\\\\some\\String\\"

print var1 # Prints \\some\\String\ o\\Match
print var2 # Prints \\some\String\

pattern = re.compile(var2)
found = pattern.match(var1 + "(.*)", re.IGNORECASE)

if found:
    print "YES"
else:
    print "NO"

変数を出力すると、奇妙な動作が見られます。re.escapeは、文字列内の必要なすべての文字をエスケープすると思いました。

Ubuntu12.4.1でPython2.7のコードを実行すると、次の例外が発生します

Traceback (most recent call last):
  File "regex_test.py", line 11, in <module>
    pattern = re.compile(var2)
  File "/usr/lib/python2.7/re.py", line 190, in compile
    return _compile(pattern, flags)
  File "/usr/lib/python2.7/re.py", line 242, in _compile
    raise error, v # invalid expression
sre_constants.error: bogus escape (end of line)

例外がスローされる原因となっている何が欠けていますか?

4

3 に答える 3

4

Python\t単一の文字です。その問題を回避するために使用することをお勧めしますr''(詳細については、「生の文字列」をグーグルで検索できます)。

同じことが\キャラクターにも当てはまります。

これを証明するために、文字列re.escapeをフィードスルーする前に、文字列を内部に印刷してみてください。それは理にかなっているはずです。

これはあなたが探しているものです:

var1 = re.escape(r'\\some\String\to\Match')
于 2012-10-22T20:26:30.693 に答える
2

re.escape文字列をエスケープして正規表現として使用するために使用されますが、エスケープvar1してから正規表現として使用var2します。

私はあなたが達成しようとしていることは次のとおりだと思います。

var1 = r'\\some\String\to\Match'
var2 = re.escape('\\\\some\\String\\')
pattern = re.compile(var2 + '(.*)', re.IGNORECASE)
found = pattern.match(var1)

r'\\some\String\to\Match'生の文字列リテラルvar2ですが、バックスラッシュで終了する必要があるため、に使用できないことに注意してください。

于 2012-10-22T20:30:26.340 に答える
0

re.escapeこの場合、あなたの生活は楽になりません:

In [68]: re.escape('\\\\some\\String\\')
Out[68]: '\\\\\\\\some\\\\String\\\\'

In [71]: re.escape(r'\\some\String\to\Match')

Out[71]: '\\\\\\\\some\\\\String\\\\to\\\\Match'

明らかに、そこにはバックスラッシュが多すぎます。

生の文字列だけでこれを行うことができます。

In [62]: import re

In [63]: re.match(r'\\\\some\\String\\(.*)', r'\\some\String\to\Match').group(1)
Out[63]: 'to\\Match'
于 2012-10-22T20:34:05.480 に答える