Python - 从字符串中提取文本

时间:2016-11-07 04:55:13

标签: python regex

从字符串中提取文本的最有效方法是什么?是否有一些可用的函数或正则表达式,或其他一些方式?

  

例如,我的字符串在下面,我也想提取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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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)

答案 2 :(得分:0)

这取决于。假设您的所有文本都以

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

您只需要两次分割即可。

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

删除多余的空格(可能只需要几个rstrip() / lstrip()个来电即可),您就完成了。或者你可以采取正则表达式。它们稍微强大一些,但在这种情况下,我认为这是个人品味的问题。

如果你想要更复杂的语法与非终端,终端和所有这些,你需要lex/yacc,这将需要解析器的一些背景。一个相当有趣的事情,但不是你想要用来存储程序选项等等。