2

このフォームにはたくさんのデータがあります

xxx(xx.xx) - 桁数は固定されていません。お気に入り

312(21.1)   378(25.5)   374(25.3)   157(10.6)   260(17.6)   1481(100)
125(28.1)   91(20.4)    94(21.1)    52(11.7)    83(18.7)    445(100)
50(28.4)    44(25)  29(16.5)    12(6.8) 41(23.3)    176(100)

これらはすべて Unicode 文字列であることに注意してください。かっこの左の数字が A で、かっこの中の数字が B だとしましょう。A(B) です。

私がやりたいのは、リスト [A,B] を返す関数を作成することです。

正規表現でできることは知っていますが、あまり得意ではありません。とにかく、私はいくつかの検索を行い、チュートリアルに従ったので、思いつきました:

re.search('\(.*?\)',s) # for B
re.search('.?\(',s) # for A

問題は、数字で括弧を返すことです。お気に入り

>>s
u'312(21.1)'
>>m=re.search('\(.*?\)',s)
>>m.group()
(21.1)

任意の助けをいただければ幸いです...

4

4 に答える 4

2

グループを定義するには、エスケープされていない括弧を使用します。

>>> [g[:2] for g in re.findall(r'([0-9]+)\(([0-9]+|[0-9]+\.[0-9]+)\)', s)]
[('312', '21.1'), ('378', '25.5'), ('374', '25.3'), ('157', '10.6'),
('260', '17.6'), ('125', '28.1'), ('91', '20.4'), ('94', '21.1'),
('52', '11.7'), ('83', '18.7'), ('50', '28.4'), ('29', '16.5'), ('12', '6.8'),
('41', '23.3'), ('176', '100')]
于 2012-09-26T06:05:29.170 に答える
1

または、多くの場合、RE よりも単純で高速な文字列操作のみを使用することもできます。

>>> s = "312(21.1)   378(25.5)   374(25.3)   157(10.6)   260(17.6)   1481(100) 125(28.1)   91(20.4)    94(21.1)    52(11.7)    83(18.7)    445(100) 50(28.4)    44(25)  29(16.5)    12(6.8) 41(23.3)    176(100)"

それをトークンに分割します

>>> tokens = s.split()
>>> tokens
['312(21.1)', '378(25.5)', '374(25.3)', '157(10.6)', '260(17.6)', '1481(100)', '125(28.1)', '91(20.4)', '94(21.1)', '52(11.7)', '83(18.7)', '445(100)', '50(28.4)', '44(25)', '29(16.5)', '12(6.8)', '41(23.3)', '176(100)']

最後に「)」を削除します

>>> intermediary1 = [ entry[:-1] for entry in tokens ]
>>> intermediary1
['312(21.1', '378(25.5', '374(25.3', '157(10.6', '260(17.6', '1481(100', '125(28.1', '91(20.4', '94(21.1', '52(11.7', '83(18.7', '445(100', '50(28.4', '44(25', '29(16.5', '12(6.8', '41(23.3', '176(100']

2つの文字列に分かれます

>>> intermediary2 = [ entry.split('(') for entry in intermediary1 ]
>>> intermediary2
[['312', '21.1'], ['378', '25.5'], ['374', '25.3'], ['157', '10.6'], ['260', '17.6'], ['1481', '100'], ['125', '28.1'], ['91', '20.4'], ['94', '21.1'], ['52', '11.7'], ['83', '18.7'], ['445', '100'], ['50', '28.4'], ['44', '25'], ['29', '16.5'], ['12', '6.8'], ['41', '23.3'], ['176', '100']]

数値に変換 (整数、浮動小数点)

>>> numbers = [ ( int(num1), float(num2) ) for num1, num2 in intermediary2 ]
>>> numbers
[(312, 21.1), (378, 25.5), (374, 25.3), (157, 10.6), (260, 17.6), (1481, 100.0), (125, 28.1), (91, 20.4), (94, 21.1), (52, 11.7), (83, 18.7), (445, 100.0), (50, 28.4), (44, 25.0), (29, 16.5), (12, 6.8), (41, 23.3), (176, 100.0)]

または、リスト内包表記を使用してより短い方法で:

>>> tokens = [ entry[:-1].split('(') for entry in s.split()]
>>> numbers = [ ( int(num1), float(num2) ) for num1, num2 in tokens ]
>>> numbers
[(312, 21.1), (378, 25.5), (374, 25.3), (157, 10.6), (260, 17.6), (1481, 100.0), (125, 28.1), (91, 20.4), (94, 21.1), (52, 11.7), (83, 18.7), (445, 100.0), (50, 28.4), (44, 25.0), (29, 16.5), (12, 6.8), (41, 23.3), (176, 100.0)]
于 2012-09-26T07:41:37.473 に答える
1

これはより良い助けになるはずです:

m = re.findall('([0-9]+\.[0-9]+|[0-9]+)', s)

私が行ったことは、文字列の小数点を利用することです。0 ~ 9 の範囲の 1 つ以上の数字、次に小数点、0 ~ 9 の範囲の 1 つ以上の数字を含む正規表現を探します。また、0 ~ 9 の範囲の文字列を別。次に、一致した式をグループ化します。

正規表現に文字列内の括弧も一致させるように求めているため、ソリューションは括弧を提供します。

これは、m に格納されている python リストとして 2 つの数値を返します。

問題が解決することを願っています。:)

于 2012-09-26T06:17:52.710 に答える
0
import re
import sys

li = []
while True:
  line = sys.stdin.readline()
  if not line: break
  for i in line.split():
    m = re.search('(.*)\((.*)\)', i)
    tup = (m.group(1), m.group(2))
    li.append(tup)

print li

出力例:

$ python y
312(21.1)   378(25.5)   374(25.3)   157(10.6)   260(17.6)   1481(100)
[('312', '21.1'), ('378', '25.5'), ('374', '25.3'), ('157', '10.6'), ('260', '17.6'), ('1481', '100')]
于 2012-09-26T06:06:09.370 に答える