0

次のような文字列があります。

50W
800W+25W
30W+50W+2W

現在の文字列が一致するかどうかを確認し、それらの数値を抽出したいと思います。

実際、私はこれをしました:

re.compile("^(\d+W\+)*(\d+W)$")

問題は、スター * を使用すると、常に最初のグループの最初の要素が取得されることです (たとえば、50W+20W+30W私は["50W+", "30W"](私は使用していre.findallます)

すべてのグループを取得する方法と、正規表現から "W" と "+" 文字を直接削除する方法がわかりません (おそらくre.split? を使用する必要があります)。

編集 1 - 文字列がこのようなものかどうかわかりません: 最初に確認してから、数字を抽出できます

4

3 に答える 3

2

これらの値を抽出するために正規表現を使用しないでください。

In [1]: [int(e[:-1]) for e in "30W+50W+2W".split('+')]
Out[1]: [30, 50, 2]

In [2]: [int(e[:-1]) for e in "800W+25W".split('+')]
Out[2]: [800, 25]

In [3]: [int(e[:-1]) for e in "50W".split('+')]
Out[3]: [50]

文字列がこのパターンに一致するかどうかを確認するために正規表現を使用することをお勧めしますが、私たちはあなたの状況を十分に把握していません.

正の先読みを使用して、数字の後に が続くものを検索できますW

In [16]: re.findall('\d+(?=W)', '30W+50W+2W')
Out[16]: ['30', '50', '2']

In [17]: re.findall('\d+(?=W)', '30W+50W')
Out[17]: ['30', '50']

In [18]: re.findall('\d+(?=W)', '30W')
Out[18]: ['30']

文字列が厳密であるかどうかを確認して、これらの数値^(\d+W\+)*(\d+W)$ 抽出することはできません。

于 2013-04-03T13:01:43.147 に答える
2

split()私の意見では、ここでは使用する方が良いアプローチです。

In [1]: '50W'.split('+')
Out[1]: ['50W']

In [2]: '800W+25W'.split('+')
Out[2]: ['800W', '25W']

In [3]: '30W+50W+2W'.split('+')
Out[3]: ['30W', '50W', '2W']

各リスト エントリから文字を取り除きたい場合はW、スライスを使用して、結果の文字列を整数に変換します。

In [4]: int('30W'[:-1])
Out[4]: 30

文字列がこの形式であるかどうかを確認するには、次の単純な正規表現を使用できます。

In [5]: pattern = re.compile(r'^\d+W(?:\+\d+W)*$')

要約すると、私は次のようにします:

In [6]: vals = ['50W', '800W+25W', '30W+50W+2W', '80W3000W2675W']

In [7]: for val in vals:
  ....:     if pattern.match(val):
  ....:         numbers = val.split('+')
  ....:         print [int(num[:-1]) for num in numbers]
[50]
[800, 25]
[30, 50, 2]
于 2013-04-03T13:02:42.067 に答える
0

Python での関数型プログラミングが好きな場合は、

>>> newlist = ['50W', '800W+25W', '30W+50W+2W', '80W3000W2675W']
>>> map(lambda x: re.findall(r"(\d+)W", x), 
        filter(lambda x: re.match('^\d+W(\+\d+W)*$',x), newlist))
[['50'], ['800', '25'], ['30', '50', '2']]
于 2013-04-03T13:39:09.213 に答える