2017-01-05 19 views
2

re.searchを使用して、空白以外の最初の文字セットを抽出します。私は私の問題を再現以下pseudoscriptあります:Pythonでの空白以外の正規表現の正規表現

#!/usr/bin/env python2.7 
import re 

line = "STARC-1.1.1.5    ConsCase WARNING Warning" 
m = re.search('^[^\S]*?',line) 
if m: 
    print m.group(0) 

をそれはこれまでのところ、私はそれを理解するように、この正規表現が言っている

空白を印刷する代わりにSTARC-1.1.1.5

ているように見えます行の先頭に 、空白以外の文字のセットを見つけ、私はこれが仕事とかなり確信していた

貪欲ことはありません、documentationは私がそう、[]内の空白文字と一致するように/ Sを使用することができますと言います私は問題がどこにあるかわからない

今、私はこれがおそらく奇妙に見えることを知っています、なぜ私はこれを行うために他の機能を使用していないのですか?まあ、猫をスキンする方法は2つ以上ありますし、私はまだPythonで正規表現のハングアップを取得していますので、re.searchを使ってこのフィールドをこのように抽出する方法を知りたいと思います。

+1

こちらは別のものです re.split( "\ s *"、行)[0] – e4c5

+0

@melpomeneは貪欲です。ここでは空文字列に分割されていません – e4c5

+0

@ e4c5これを試して、 'FutureWarning:split()には空でないパターンマッチが必要です。' '\ s +'では警告が出ませんでした。 – melpomene

答えて

4

[^\S]は、(空白パターン)に等しいnegated character classです。 *?は、以上の文字に一致しますが、できるだけ少ないと一致する遅延量子です。パターンの最後に使用すると、実際にはいずれの文字にも一致しません。

m = re.match(r'\S+',line) 

かであなたのm = re.search('^[^\S]*?',line)ラインを交換してください - あなたはまた、空の文字列に一致できるようにしたい場合:

m = re.match(r'\S*',line) 

re.match方法は、文字列の先頭にパターンを固定します。 re.searchを使用すると、パターンの開始時に^アンカーを維持する必要があります。

m = re.search(r'^\S+',line) 

Python demoを参照してください:

import re 
line = "STARC-1.1.1.5    ConsCase WARNING Warning" 
m = re.search('^\S+',line) 
if m: 
    print m.group(0) 
# => STARC-1.1.1.5 

しかし、ここでは、このような場合には、あなただけの単なるsplit()を使用することができます:

res = line.split() 
print(res[0]) 

another Python demoを参照してください。

2

\sは、空白文字と一致します。

\Sは、空白以外の文字と一致します。

[...]は、セット...の文字と一致します。

[^...]は、セット...にない文字と一致します。

[^\S]は、空白以外の文字ではない、つまり空白文字と一致する文字と一致します。