2016-11-07 174 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

使用正則表達式,首先提取每個User(ID = {matching expression},ScreenName = {matching experssion})',然後進行另一次提取以獲得所需內容。 –

+0

@Jakub,我修改了我的帖子。我想解析的文本現在在帖子的底部。我特意要解析出1234567890,233323490,4459284和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 目標的暱稱= RandomNameHere,AnotherRandomName,YetAnotherName

+0

哇,完美的工作!謝謝!現在要了解代碼實際上在做什麼:) – New

0

我會使用的正則表達式是:

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

但是,這裏假定ID只是數字(\d),用戶名只能是字母或數字([\w\d])。

此正則表達式(與re.findall相結合)都將返回一個通過迭代和分類以某種方式像這樣的比賽名單:

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

這要看情況。假設您的所有文字都以

的形式出現
TagName = TagValue1, TagValue2, ... 

您只需要兩次調用就可以進行拆分。

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

移除多餘的空間(可能是一對夫婦的rstrip()/lstrip()電話就足夠了),和你做。或者你可以採取正則表達式。他們稍強一些,但在這種情況下,我認爲這是個人品味的問題。

如果你想要非終結者,終端等等更復雜的語法,你需要lex/yacc,這將需要一些解析器背景。一個相當有趣的事情,但不是你想用來存儲程序選項等。

+0

我會研究這一點。謝謝。 – New