2016-11-07 19 views
1

文字列からテキストを抽出する最も効率的な方法は何ですか?いくつかの利用可能な関数や正規表現、あるいは他の方法がありますか?Python - 文字列からテキストを抽出する

たとえば、私の文字列は以下の通りです。また、IDを抽出するには、 を別途ScreenNamesとして使用します。

[User(ID=1234567890, ScreenName=RandomNameHere), User(ID=233323490, ScreenName=AnotherRandomName), User(ID=4459284, ScreenName=YetAnotherName)] 

ありがとうございます!

編集:これは、取得したいテキスト文字列です。私は彼らをリストに入れて欲しい。

Target_IDs = 1234567890、233323490、4459284 Target_ScreenNames = RandomNameHere、AnotherRandomName、YetAnotherName

+0

投稿の下にリストを解析するテキストはありますか? – Jakub

+0

regexを使って、それぞれの 'User(ID = {一致する式}、ScreenName = {一致するexperssion})'を抽出し、次に別の抽出を行い、あなたが望むものを得る。 –

+0

@Jakub、私は私の投稿を改訂しました。私が解析したいテキストは今、記事の一番下にあります。私は具体的に1234567890,233323490,44559284とRandomNameHere、AnotherRandomName、YetAnotherNameをパースしようとしています – New

答えて

0
import re 
str = '[User(ID=1234567890, ScreenName=RandomNameHere), User(ID=233323490, ScreenName=AnotherRandomName), User(ID=4459284, ScreenName=YetAnotherName)]' 
print 'Target IDs = ' + ','.join(re.findall(r'ID=(\d+)', str)) 
print 'Target ScreenNames = ' + ','.join(re.findall(r' ScreenName=(\w+)', str)) 

出力: ターゲットID = 1234567890,233323490,4459284 目標ScreenNames = RandomNameHere、AnotherRandomName、YetAnotherName

+0

うわー、それは完璧に働いた!ありがとうございました!コードが実際に何をしているのかを今すぐ学びましょう:) – New

0

私が使用する正規表現は次のようになります:

(?:ID=|ScreenName=)+(\d+|[\w\d]+) 

ただし、IDは数字(\d)のみであり、ユーザー名は文字または数字([\w\d])のみであることを前提としています。

import re 

s = "[User(ID=1234567890, ScreenName=RandomNameHere), User(ID=233323490, ScreenName=AnotherRandomName), User(ID=4459284, ScreenName=YetAnotherName)]" 
pattern = re.compile(r'(?:ID=|ScreenName=)+(\d+|[\w\d]+)'); 

ids = [] 
names = [] 

for p in re.findall(pattern, s): 
    if p.isnumeric(): 
     ids.append(p) 
    else: 
     names.append(p) 

print(ids, names) 
+0

正規表現に感謝します。ユーザー名には文字と数字を使用できます。 – New

+0

その可能性を考慮して更新されました。'[\ d \ w]'は文字か数字のどちらかにマッチし、 '+'は複数のマッチを許します。 – Darkstarone

0

それが依存:

この正規表現(re.findallと結合)を介して、反復などのようないくつかの方法でソートすることができマッチのリストを返します。すべてのテキストが

TagName = TagValue1, TagValue2, ... 

の形式で入力されていると仮定します。

tag, value_string = string.split('=') 
values = value_string.split(',') 

は、過剰なスペースを削除(おそらくrstrip()/lstrip()呼び出しのカップルが十分であろう)、あなたが行われています。または正規表現を取ることができます。彼らはやや強力ですが、この場合は個人的な味の問題だと思います。

非終端記号、ターミナルなどの複雑な構文が必要な場合は、lex/yaccが必要です。これには、パーサーの背景が必要です。やはり面白いことですが、プログラムのオプションなどを保存するために使用したいものはありません。

+0

私もこれについて検討します。ありがとうございました。 – New

関連する問題