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