2016-11-07 3 views
1

Каковы наиболее эффективные способы извлечения текста из строки? Существуют ли некоторые доступные функции или выражения регулярных выражений или каким-либо другим способом?Python - Извлечь текст из строки

Например, моя строка ниже, и я хочу также извлечь ID в качестве имен Screen, отдельно.

[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 = {соответствующее выражение}, ScreenName = {matching experssion})' сначала, затем сделайте еще одно извлечение, чтобы получить то, что вы хотите. –

+0

@ Якуб, я пересмотрел свой пост. Текст, который я хочу проанализировать, теперь находится в нижней части сообщения. Я специально ищу, чтобы разобрать 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)) 

Выход: Целевой идентификаторы = 1234567890,233323490,4459284 Задача ScreenNames = RandomNameHere, AnotherRandomName, YetAnotherName

+0

Вау, это сработало отлично! Спасибо! Теперь, чтобы узнать, что на самом деле делает код :) – New

0

Регулярное выражение, которое я использовал бы, будет:

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

Однако это предполагает, что идентификатор - это только цифры (\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

Смежные вопросы