2013-09-26 3 views
2

У меня возникают проблемы с разбивкой моих имен по их указанному порядку, имени и их экзамену.Как разбить строку на несколько частей в python?

я сделал следующее в моем коде: print repr(names) в цикле, чтобы получить следующие 6 строк данных

'1 Name 559/1 ' 
'2 Name 484/1 ' 
'3 Name N'ame 444/2 ' 
'4 Name 400/1 ' 
'5 Name Name 928/5 ' 
'6 Name Name-Name 1292/10 ' 

Я хочу, чтобы иметь возможность разделить их, но я получаю сообщение об ошибке говорящее AttributeError: 'str' object has no attribute 'lsplit'

у меня было пойти с использованием lsplit, rsplit и раскола, но я не могу заставить его работать ...

в названиях конечного результата будет превращен в 3-х переменные: names_index, name и names_score

Кто-нибудь знает, как я могу это добиться?

Спасибо - HYFLEX

EDIT

for item in listitems: 
    if item.find("strong"): 
     names = str(item.text) 
     names = items .split("\n") 
     for name in names: 
      clean_name = name.lstrip(" ") 
      print repr(clean_name) 
      student_number = clean_name.lsplit(" ", 1) 
      student_score = clean_name.rsplit(" ", 1) 
      #student_name = clean_name.lsplit(" ", 1) # Unsure how to get the last part.. 

ответ

6

Там нет str.lsplit, потому что str.split уже идет с левой стороны.

Для каждой строки, просто вызовите .split(), и вы получите список с [names_index, name, names_score]

Если шаблон number/words/more numbers, то вы можете использовать регулярные выражения:

>>> import re 
>>> filter(None, re.split(r'(\d+) (\w.*) (\d.*)', '1 Name 559/1 ')) 
['1', 'Name', '559/1 '] 
>>> filter(None, re.split(r'(\d+) (\w.*) (\d.*)', '6 Name Name-Name 1292/10 ')) 
['6', 'Name Name-Name', '1292/10 '] 
+0

Проблема в том, что иногда мои имена имеют пробелы в именах и/или символов в имени. – Ryflex

+0

@Hyflex Могут ли имена содержать в нем номера? – TerryA

+0

Нет, я не думаю, что мои ученики будут иметь номера в своих именах. Отредактировано, чтобы показать мой пример, что я пробовал. – Ryflex

3

rsplit возвращает расщепляется результат, а не только последняя часть. Таким образом, вы действительно идете в правильном направлении.

Для вашего кода, где вы могли бы иметь место в вашем имени, вы можете сделать это:

the_string = the_string.strip() 
[id, name_score] = the_string.split(' ',1) # Split into ['1', 'name name 654/1'] 
[name, score] = name_score.rsplit(' ',1) # Split into ['name name','654/1'] 

так, для ввода `6 Название Название-имя 1292/10' ваши предназначенные значения уже есть:

id # this is '6' 
name # this is 'Name Name-name' 
score # this is '1292/10' 
+0

Я уверен это не проблема здесь – TerryA

+1

извините, изменено. – justhalf

+0

Отредактировано мое сообщение, чтобы показать пример того, что я пытался добиться ... – Ryflex

3

Его так легко, как -

>>> s = '4 Name 400/1 ' 
>>> names_index, name, names_score = s.split() 
>>> names_index, name, names_score 
('4', 'Name', '400/1') 
>>> 

Как сказал Haidro, нет никакой функции, как lsplit, использовать расщепленные модули TEAD.

+0

Отредактировано мое сообщение, чтобы показать пример того, чего я пытался достичь ... – Ryflex

+1

@Hyflex выглядит хорошо, поддерживается! – theharshest

3

вы можете работать таким образом со списком

>>> names = ['1 Name 559/1 ', 
'2 Name 484/1 ', 
'3 Name Naaame 444/2 ', 
'4 Name 400/1 ', 
'5 Name Name 928/5 ', 
'6 Name Name-Name 1292/10 '] 
>>> names_lst=[] 
>>> for n in names: 
    names_lst+=n.split() 

дает

>>> names_lst 
['1', 'Name', '559/1', '2', 'Name', '484/1', '3', 'Name', 'Naaame', 
'444/2', '4', 'Name', '400/1', '5', 'Name', 'Name', '928/5', '6', 'Name', 
'Name-Name', '1292/10', ['1', 'Name', '559/1'], ['2', 'Name', '484/1'], 
['3', 'Name', 'Naaame', '444/2'], ['4', 'Name', '400/1'], 
['5', 'Name', 'Name', '928/5'], ['6', 'Name', 'Name-Name', '1292/10']] 
+0

Проблема в том, что имена должны быть объединены, а не разделены. Отредактировано, чтобы показать мой пример, что я пробовал. – Ryflex

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