0

私は現在、その中にある特定のテキストのpython文字列を解析しようとしています。それは実際には本当に簡単なはずです。

しかし、もっと重要なことは、正規表現が「ツールセット」タイプのものであるかどうか、特定の数のトリックを知っているかどうかを知りたいですか? 一部の人々はそれらに非常に熟練しており、私はその熟練度を達成したいと考えています.

この文字列をどのように一致させるかを尋ねている間、解決策にたどり着いたときの思考プロセスの説明をお願いします

基本的に、カンマだけで区切られたテキスト A、text-B、および text_C が必要です。

目的の出力文字列:

"text A,text-B,text_C"

元のテキストは次のとおりです。

"(1, u'text A', u'text-B', u'text_C')"

私の限られた理解では、各式を区切る主なものは一重引用符であることを理解しているので、それから始めます。しかし、最終的には次のような文字列が含まれる可能性がありtext-'A、文字列を正しく解析しないためにエラーが発生しないようにしたいと考えています。

御時間ありがとうございます。覚えておいてください:思考プロセス。

4

2 に答える 2

3

扱っている文字列は Python タプルの repr バージョンであるため、最も Pythonic な方法は、ast.literal_evalそのオブジェクトを取得し、正しい型を保持する Python オブジェクトに安全に変換して戻すことができるものを使用することです。

import ast
text = "(1, u'text A', u'text-B', u'text_C')"
tup = ast.literal_eval(text)

次に、文字列である各項目のみを結合したい場合:

joined = ', '.join(el for el in tup if isinstance(el, basestring))
# text A, text-B, text_C

それ以外の場合は、タプルをスライスtup[1:]してその中のアイテムを結合するだけです...

正規表現に関して言えば、迅速で汚れた、堅牢ではない方法であり、簡単に壊れて、状況によっては誤った一致を提供する可能性さえあります。

import re
string_vals = re.findall("'(.*?)'", text)

'これは、次までのすべてを検索し'ます...繰り返しますが、ここでは使用するast.literal_eval方がはるかに優れています...

于 2013-08-02T23:32:29.427 に答える
0

それは正規表現でなければなりませんか?:(

a_str = "(1, u'text A', u'text-B', u'text_C')"
print ",".join(a_str[1:-1].split(",")[1:]).replace('u','').replace("'",'')

収量:

text A, text-B, text_C

編集:正規表現でなければならない場合..この投稿を気にしないでください。多くの場合、機能しません。

于 2013-08-02T22:51:12.147 に答える