2016-09-24 2 views
1

私はPythonを初めて使用しており、正規表現のドキュメントを読んでいるとかなり混乱しています。私が理解するところでは、re.searchは文字列のどこでも検索し、re.matchは文字列の先頭だけを検索します。しかし、いつre.compileを使用する必要がありますか?文字列中の最初のアルファベットから最後のアルファベットを見つけよう

正規表現で試してみましたが、うまく動作しませんでした。文字列、句読点、数字、スペースが混在している場合は、文字列の一部をどのようにしてアルファベットで得ることができますか?

import re 
a = "123,12 jlkjL kSljdf 12.2" 
test = re.search('^[a-zA-Z]', a) 
print test 

私が得ようとしている出力はjlkjL kSljdfです。

+0

['re.search(r '[a-zA-Z] +'、a).group().strip()'](http://ideone.com/EwO0Jb)文字にスペースを入れますクラスに '+'(1以上)の量子を設定します。余分な空白を 'strip'で取り除きます。 –

答えて

1

正規表現操作を使用する前に、re.compileを使用して正規表現オブジェクトをコンパイルすることができます。

何をしたいahcieveするには、2つのオプションがあります:スペースで文字を照合して、開始/終了からすべての非文字記号を冗長空白を除去または削除:

import re 
a = "123,12 jlkjL kSljdf 12.2" 
rg = re.compile(r'[a-zA-Z ]+') 
mtch = rg.search(a) 
if mtch: 
    print (mtch.group().strip()) # => jlkjL kSljdf 

# Stripping non-letters from the start/end 
rx = re.compile(r'^[^a-zA-Z]+|[^a-zA-Z]+$') 
print(rx.sub('', a)) # => jlkjL kSljdf 

Python demo

を参照してください。最初のアプローチでは、文字クラスにスペースを入れ、それに+(1回以上出現)の量子を設定します。第2のアプローチでは

^[^a-zA-Z]+は、文字列の末尾文字以外の文字列(^)OR(|)1又はそれ以上の文字の開始時の文字([^a-zA-Z])以外の1以上(+)文字にマッチします($)。

+0

ありがとうございますが、私は 're.compile'の部分についてまだ不明です。正規表現オブジェクトをコンパイルする必要があるのはなぜですか? 're.compile'は結果を"有用な "方法で提示するのに役立ちますか?私は 'print re.search(r '[a-zA-Z] +'、a)'を試してみましたが、 '_Sre.SRE_Match object at 0x10f7503d8 'を返します。 2番目のアプローチでは、なぜ[^ [^ a-zA-Z] + 'に2つの'^'を使用しなければなりませんでしたか? –

+0

私は今、私の娘を養っていますが、1)正規表現オブジェクトをコンパイルすると正規表現の操作が速くなり、何度も再利用する必要があるときに便利です。2)角括弧の外側の '^'文字列の始め、 ''^.. ''は文字クラスを否定します、4)' .group() 'は' re.search() 'をプリントするとマッチ値にアクセスします。オブジェクト*。 –

関連する問題