4

私はPythonの初心者であり、正規表現の使用について支援が必要です。

私はこのような文字列を持っています:

利用可能な新しいビルドバージョン:20120418-abcdef-1(SDK 0.0.0.1に基づく)

上記の文字列から正規表現を使用して次のテキストを抽出したい

20120418-abcdef-1 0.0.0.1

私はこれを分割で行うことができますが、これを行うには効果のない方法だと思います。正規表現を使ってみましたが、絞り込むことができませんでした。

たとえば、私は使用しました

sdk_version = re.search(r"SDK(.*)", lines,)
                    print sdk_version.group(1)

しかし、これはバージョン0.0.0.1)をパランセシスと一緒に与えました。私は')'を削除する方法を知りませんでした..ここでいくつかの助けが必要です..

ありがとう-Vijay

4

6 に答える 6

2
>>> s = "New builds available Version: 20120418-abcdef-1 (based on SDK 0.0.0.1)"
>>> import re
>>> version = re.compile(r"(?<=Version: )\d*-[a-z]*-\d")
>>> version.search(s).group()
'20120418-abcdef-1'

これは一致します

(preceded by "Version: ")
a string of digits
hyphen
a string of lowercase letters
hyphen
a digit

同様に、

>>> subversion = re.compile(r"(?<=SDK )\d*.\d*.\d*.\d*")
>>> subversion.search(s).group()
'0.0.0.1'

一致する

(preceded by "SDK ")
a string of digits
a dot
a string of digits
a dot
a string of digits
a dot
a string of digits
于 2012-04-18T18:39:28.120 に答える
2

すべての文字列が提供されたものとまったく同じになるかどうかはわかりませんが、提供された正確な文字列の正規表現は次のようになります。

: (.*) \(based on SDK (.*)\)

これは次のことを行います。

-:が表示された後、マッチングを開始します。

-これによりグループが開きます(これは、キャプチャされた値を後で参照できるようにする正規表現の特別な構成です)。

。* -この部分は、スペースまですべてに一致します。

\( -これは「実際の」中括弧に一致し、サブグループを開きません。

\) -これは「実際の」閉じ中括弧と一致し、サブグループを閉じません。

したがって、pythonこれは次のようになります。

import re
s = "New builds available Version: 20120418-abcdef-1 (based on SDK 0.0.0.1)"
r = re.compile(r": (.*) \(based on SDK (.*)\)")
m = r.search(s)
m.groups()
>> ('20120418-abcdef-1', '0.0.0.1')
于 2012-04-18T18:46:00.063 に答える
2

バージョン番号に含めることができるのは文字、数字、ドット、ダッシュのみであると仮定すると、必要なのはこれだけです。

version, sdk = re.findall(r'(?:Version: |SDK )([\w.-]+)', s)

例:

s = "New builds available Version: 20120418-abcdef-1 (based on SDK 0.0.0.1)"

import re
version, sdk = re.findall(r'(?:Version: |SDK )([\w.-]+)', s)

print version
print sdk

## 20120418-abcdef-1
## 0.0.0.1
于 2012-04-18T19:21:32.000 に答える
1

おそらくあなたはしたいかもしれません

>>> st="New builds available Version: 20120418-abcdef-1 (based on SDK 0.0.0.1)"
>>> "".join(re.findall(":[ ]*(.*?)[ ]*\(.*SDK(.*)\)",st)[0])
'20120418-abcdef-1 0.0.0.1'
于 2012-04-18T18:38:40.510 に答える
1

特にSDKバージョンの場合、。*はここで必要なものには広すぎます。すべてに一致するため、文字列の残りの部分全体に一致します。正規表現の本文「SDK([0-9。] +)」を使用して、最初のグループを取得することができます。(「[0-9。] +」は数字とピリオドの文字列に一致します。)

バージョン文字列の場合、「バージョン:([a-bA-B0-9-] +)(」のようなものと照合して、最初のグループを取得できます。これは、英数字とハイフン、およびスペースとオープンパレンが続きます。

于 2012-04-18T18:38:55.093 に答える
1

@Gjallarはすでに非常に良い答えを書いています。彼の答えを少し調整します。

import re
s = "New builds available Version: 20120418-abcdef-1 (based on SDK 0.0.0.1)"
r = re.compile(r":\s+(.*)\s+\(based on SDK\s+(\S+)\s*\)")
m = r.search(s)
m.groups()
>> ('20120418-abcdef-1', '0.0.0.1')

彼がスペースを持っていたいくつかの場所で、私はそれ\s+をあらゆる種類の空白の1つ以上に一致するものに置き換えました。したがって、そこに余分なスペースやタブなどが入った場合でも、これは一致します。

同様に、SDK文字列のパターンを変更しました。まず、をに変更した.*ので\S+、何にも一致するのではなく、空白以外の文字にのみ一致するようになり、少なくとも1つは存在する必要があります。\s*また、任意の種類の空白の0個以上に一致するものを追加しました。空白がない場合、これは何もしませんが、空白がある場合はそれに一致します。ただし、括弧の外側にあるため、空白はキャプチャされません。したがって、SDK文字列は一致しますが、空白は含まれません。

s = "New builds available Version: 20120418-abcdef-1 (based on SDK 0.0.0.1 )"

@Gjallarの元のパターンでは、SDK文字列はそうなります"0.0.0.1 "が、私のパターンではまだ取得できます"0.0.0.1"

于 2012-04-18T19:07:39.583 に答える