2017-02-23 4 views
0

いくつかの正規表現を任意の数のスペースで連結しようとしています。これは変数Pythonでは、文字列のリストを、正規表現で区切り記号としてバックスラッシュ文字でエスケープしないで結合する方法

私は

SPACES.join(['from','till']) 

をしようとした場合

SPACES = "\s*" 

しかし、私は取得

'from\\s*till' 

の間にバックスラッシュ文字が追加されています。追加の\を挿入せずにjoinメソッドを使用することはできますか(結果が'from\s*till'になるように)

+0

あなたはその出力を「取得」する方法:また、リテラル'\\'として与えることができますので、バックスラッシュはバックスラッシュ文字として解釈され、有効なエスケープシーケンスは、ないですか? – depperm

+0

'SPACES =" \ s * "'は有効ではありませんPython –

+0

@ cricket_007 - 混乱しています。 –

答えて

2

であることを確認することでこれを確認することができ、あなたが必要とする文字列です。前者はそのエスケープ形式(あなたが/同じ文字列オブジェクトをインスタンス化するために使用することができリテラルの形)で特殊文字を示し、後者はそうではない。他の回答で述べたように

> SPACES = "\s*" 
> pat = SPACES.join(['ab', 'cd']) 
> pat 
'ab\\s*cd' # == repr(pat) 
> print pat 
ab\s*cd  # == str(pat) 
# re.match(pat, 'ab cd') matches as expected 

'\s'

> '\s*' == '\\s*' 
True 
> r'\' # not a valid raw string! -> error 
+0

実際、私はiPython端末から' __repr__'表現を表示していました。 –

1

あなたが書いた:

SPACES = "\s*" # not what you think 

Pythonはsを脱出しようとしますが、それは、有効なエスケープシーケンスではないので、それはあきらめ、"\\s*"として文字列全体を解釈します。このようにコーナーケースに頼っていると、コードが理解しにくくなります。代わりに、適切なフォームを使用する必要があります。

SPACES = r"\s*" # same as "\\s*" and also shows intent 

一番下の行は'\s'が適切な値ではありませんので、Pythonは常に'\\s'に変換します、したがって、あなたはどこにでも出力に'\s'を見ることは決してないだろうということです文字列。あなたが期待する結果('from\s*till')は、r文字列(r'from\s*till')と解釈されない限り不可能です。

1

それが有効なエスケープシーケンスではありません(here有効なエスケープシーケンスを参照)ので、Pythonはあなたが(あなたが)リテラルのバックスラッシュをしたいと仮定して、それをエスケープ\sので、印刷するときは、'from\\s*till'を取得します。

いずれかの方法で、最終的に文字列を使用すると、len(SPACES.join(['from','till']))あなたは単なる文字列オブジェクトの__repr__とその__str__表現の違いを観察している11なく12

関連する問題