2012-04-04 30 views
0

は、私は一般的に、パターンに一致するようにre.findall(p, text)を使用しますが、今、私は疑問に出くわした:文字列中の特殊正規表現文字をエスケープする方法は?

私はちょうどpは通常の文字列ではなく、正規表現としてマッチさせたいです。

たとえば、pに '+'または '*'が含まれている場合、これらの文字にregexのような特別な意味がないようにします。別の言葉では、私はpを文字ごとに一致させたい。

この場合、pは私にはわかりません。したがって、特殊文字を無視するために '\'を追加することはできません。

>>> p = 'foo+*bar' 
>>> import re 
>>> re.escape(p) 
'foo\\+\\*bar' 

それともpは、別の文字列内にあるかどうかを確認するために文字列操作を使用します:あなたはre.escapeを使用することができます

+0

「p」がわからない場合は、正規表現としてどのように使用できますか? – Marcin

+1

@Marcin:彼は 'p'に関する先験的な情報を持っていないので、すでにエスケープされた文字列をハードコードすることはできません。なぜこれが下落したのか分からないのですか? @ NiklasB。 –

+0

まあ、おそらく、しかし、なぜ彼は文字列を持っている場合、特殊文字をエスケープできませんでしたか? – Marcin

答えて

10

>>> p in 'blablafoo+*bar123' 
True 
>>> 'foo+*bar foo+*bar'.count(p) 
2 

ところで、埋め込みたい場合は、これは主に便利ですpを適切な正規表現に変換します。

>>> re.match(r'\d.*{}.*\d'.format(re.escape(p)), '1 foo+*bar 2') 
<_sre.SRE_Match object at 0x7f11e83a31d0> 
+0

私はre.findall()を使いたいので、re.escape()は私のためには最高だと思います! :) –

+0

@ZhuShengqi:逐語的な文字列を検索するには、 're.findall()'は本質的に役に立たない。 'res.findall(" ab "、" abcabcabc ")'は '[" ab "、" ab "、" ab "]'となります。おそらく 'str.count()'が必要です。 –

+0

@Zhu:そうだね、正規表現が必要ない*場合は、それらを使用しないでください。エスケープするのが便利な状況は、(a)より複雑な正規表現に 'p'を組み込むことです。(b)正規表現のリストと照合したいものもあります。 –

2

yo

if pattern in string: 

あなたは文字列の先頭や末尾にテストする場合:

if string.startswith(pattern): # or .endswith(pattern) 
uが使用し、正規表現を必要とし、ちょうどパターンが文字列の部分文字列があるかどうかをテストする必要はありません

その他の文字列メソッドのドキュメントのstring methodsセクションを参照してください。

あなたがstr.findを使用し、文字列内の部分文字列のすべての場所を知っておく必要がある場合:

offsets = [] 
offset = string.find(pattern, 0) 
while offset != -1: 
    offsets.append(offset) 
    # start from after the location of the previous match 
    offset = string.find(pattern, offset + 1) 
0

あなたは、文字列に.findを使用することができます。これは「針」文字列の最初の出現のインデックスを返します(見つからない場合は-1)。例えば

>>> a = 'test string 1+2*3' 
>>> a.find('str') 
5 
>>> a.find('not there') 
-1 
>>> a.find('1+2*') 
12 
関連する問題