1

解析する必要のある文字列があります。サンプル文字列は次のとおりです。

sample_string = "([0, 22, 23, 24, 25, 47, 59],36155), ([0, 1, 22, 23, 24, 25, 47, 59, 7],36154), ([0, 1, 22, 23, 24, 25, 47, 50, 59, 7],36153)"

次の正規表現を試しましたが、うまくいかないようです。

\((\[[(\d)+][,?])+\]),(\d)+\)

正規表現の目的は、タプルの整数部分だけでなく、タプルのリスト部分にも簡単にアクセスできることです。最も簡単なのはast.literal_eavl(sample_string)を使用することですが、なぜ上記の正規表現が正しく解析できないのか疑問に思っていましたか?

4

4 に答える 4

5

やむを得ない理由がない限り、ここで正規表現を使用することはお勧めしません。

astモジュールを試してください

>>> import ast
>>> sample_string = "([0, 22, 23, 24, 25, 47, 59],36155), ([0, 1, 22, 23, 24, 25, 47, 59, 7],36154), ([0, 1, 22, 23, 24, 25, 47, 50, 59, 7],36153)"
>>> ast.literal_eval(sample_string)
(([0, 22, 23, 24, 25, 47, 59], 36155), ([0, 1, 22, 23, 24, 25, 47, 59, 7], 36154), ([0, 1, 22, 23, 24, 25, 47, 50, 59, 7], 36153))
>>> 
于 2013-03-05T06:30:51.403 に答える
2

あなたの問題のいくつかは、コメントで述べられているように、不均衡な括弧や空白を考慮していないことを含みます。必要なものを抽出する1つの正規表現は次のとおりです。

data = re.findall(r'\((\[(\d+,?\s?)+\]),\s*(\d+)\)', sample_string)

# data:
# [('[0, 22, 23, 24, 25, 47, 59]', '59', '36155'),
#  ('[0, 1, 22, 23, 24, 25, 47, 59, 7]', '7', '36154'),
#  ('[0, 1, 22, 23, 24, 25, 47, 50, 59, 7]', '7', '36153')]

for d in data:
    int_list_str = d[0]
    trailing_int_str = d[2]
于 2013-03-05T06:31:51.990 に答える
0

正規表現の代わりにsplitand関数を使用するのはどうですか?eval

list_of_lists = []
list_of_ints = []
tuple_list = sample_string.split(", ")
for tup in tuple_list:
    list_part,int_part = eval(tup)
    list_of_lists.append(list_part)
    list_of_ints.append(int_part)

編集:これは、タプルの各ペアの間に一貫して「、」があり、他の場所にない場合にのみ機能します(つまり、リスト内およびタプル内のコンマの後のスペースを削除する必要があります)。データはこのようにフォーマットされていないため、このアプローチは失敗します。

于 2013-03-05T06:38:59.743 に答える
-1

Regex解決しようとしている問題には悪い考えです。マッチグループを使用して、最後のアイテムのみをキャプチャできます。

例えば:

>>> import re
>>> 
>>> sample_string = r'([0, 22, 23, 24, 25, 47, 59],36155), ([0, 1, 22, 23, 24, 25, 47, 59, 7],36154), ([0, 1, 22, 23, 24, 25, 47, 50, 59, 7],36153)'
>>> 
>>> regexStr = r'(\(\[((\d+, )*\d+)\],\d+\), )*\(\[(\d+, )*\d+\],\d+\)'
>>> matchObj = re.match(regexStr, sample_string)
>>> print matchObj.groups()
('([0, 1, 22, 23, 24, 25, 47, 59, 7],36154), ', '0, 1, 22, 23, 24, 25, 47, 59, 7', '59, ', '59, ')

eval代わりに、文字列からリストを取得するために使用します。

于 2013-03-05T06:31:48.043 に答える