Pythonで非空白文字を照合するための正規表現

2017-01-05 python regex python-2.7 whitespace

re.searchを使用して、非空白文字の最初のセットを抽出します。私の問題を再現する次の疑似スクリプトがあります。

#!/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の代わりに空白を印刷しているようです

私が理解している限り、この正規表現は次のように言っています。 行の先頭で、空白以外の文字のセットを見つけます。貪欲にしないでください

私はこれがうまくいくと確信していました、 ドキュメントは/ Sを使用して[]の空白と一致させることができると言っているので、問題がどこにあるのかわかりません。

今、私は知っている、これはおそらく奇妙に見えることを知っています、なぜこれを行うために他の関数を使用しないのですか?まあ、猫のスキンを作成する方法は複数ありますが、Pythonで正規表現のコツをつかんでいるので、re.searchを使用してこの方法でこのフィールドを抽出する方法を知りたいのですが。

Answers

[^\S]は、 \s (空白パターン)に等しい否定された文字クラスです。 *? ゼロ以上の文字に一致する遅延量指定子ですが、 可能な限り少なく 、パターンの最後に使用すると、実際にはどの文字にも一致しません。

m = re.search('^[^\S]*?',line)行を次のように置き換えます

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

または-空の文字列の一致も許可する場合:

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

re.matchメソッドは、文字列の先頭にパターンを固定します。 re.searchでは、パターンの先頭に^アンカーを維持する必要があります。

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

Pythonデモを参照してください。

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])

別のPythonデモを参照してください。

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

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

[...]セット内の文字に一致し...

[^...]セットにない文字に一致し...

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

以下のようにre.searchを置き換えます。\ Sは空白以外の文字を検出し、+は1回以上検索します。 Pythonは最初の文字から検索を開始します。

import re
line = "STARC-1.1.1.5             ConsCase    WARNING    Warning"
m = re.search('\S+',line)
print(m.group(0))
import re
line = "STARC-1.1.1.5             ConsCase    WARNING    Warning"
m = re.search('S.+[0-9]',line)
print(m.group(0))

re.searchは一致を返すので、アルファベットと数字を使用して、コードに記載されているように一致を出力します。変数のみを出力する場合、マッチ1として出力されます。 これがあなたの質問に答えることを願っています

m = re.search('[A-Z].+[0-9]',line)

re.searchを大文字に変更すると、CAPS AからZに検索されます。 次のように小文字に変更した場合

m = re.search('[a-z].+[0-9]',line)

小さな文字しか見つかりません。シンボルをハイライト表示して、そこから検索したり、そのシンボルの前の文字まで検索したりすることもできます。

Related