2016-10-25 3 views
2
この文字列から

正規表現:グループ内の最初の文字をスキップしますか?

s = 'stringalading-0.26.0-1' 

私は一部0.26.0-1を抽出したいと思います。

pattern = r'[.\-\d]+' 

これが与える:私はそうのように、私はまた、文字のグループを使用しようとしたこの

pattern = r'\d+\.\d+\.\d+\-\d+' 

のような分割またはパターンを使用して正規表現を使用して、これを達成するための様々な方法を考えることができます私:

In [30]: re.findall(pattern, s) 
Out[30]: ['-0.26.0-1'] 

だから私は疑問に思いました。それは、この場合には、-の最初の発生を、グループ内の文字の最初の発生をスキップすることは可能でしょうか?

+0

最初の正規表現は正常に動作しますが、文字列を2つの部分に分割する必要がある場合は、正規表現を使用しないことをおすすめします。w最初のハイフン。下の私の答えを見てください。 –

答えて

2

ことが可能であるの文字の最初の発生をスキップするためにグループ、この場合、最初の - ?

NO、照合時に、正規表現エンジンは、左から右への文字列を処理し、一致するパターンが見つかると、テキストの一致チャンクが一致バッファに書き込まれているからです。したがって、必要なものだけにマッチする正規表現を書くか、不要な文字を左側から取り除いて結果を後処理します。

ここでは正規表現は必要ありません。あなたは-で文字列をsplit1に設定maxsplit個引数を渡し、その後、ちょうど2番目の項目にアクセスすることができます。

import re 
s = 'stringalading-0.26.0-1' 
pat = r'\d+\.\d+\.\d+-\d+' 
print(re.findall(pat, s)) # => ['0.26.0-1'] 

s = 'stringalading-0.26.0-1' 
print(s.split("-", 1)[1]) # => '0.26.0-1' 

は、また、あなたの最初の正規表現works wellPython demo

を参照してください。

1

の操作を行います。

-(.*) 

とグループに取り込まれます。1.

例:

In [9]: s = 'stringalading-0.26.0-1' 

In [10]: re.search(r'-(.*)', s).group(1) 
Out[10]: '0.26.0-1' 
+0

ニースのソリューション!グループ1は最初の '' -''の後のすべてです。 – LarsVegas

+0

@LarsVegas '。*'は '-'の後のすべてであり、'() 'を使ってそれを捕捉しています。 – heemayl

+0

しかし、質問は残っています:私の例のようにグループ内の特定の文字列の最初の出現をスキップすることは可能ですか? – LarsVegas

関連する問題