Поиск текста за пределами квадратных скобок после начала конкретной строки - PullRequest
1 голос
/ 23 мая 2019

Я пытаюсь найти текст за пределами квадратных скобок, следующий за конкретной строкой [Имя].Затем я создам новый столбец в DataFrame для «Имени» людей.Порядок поля информации может измениться, поэтому, например, я не могу вызвать текст между [Имя] и [Возраст].

Пример DataFrame:

Info = {'Information': ["[Name] Tom [Age] 22 [Height] 6'2","[Age] 21 [Name] Ben [Height] 6'0","[Age] 20 [Name] Mike [Height] 6'3"]}

df = DataFrame(Info,columns= ['Information'])

Воткод, который я попробовал:

Name = []
for i in range(0,len(df)):
   start = 'Name]'
   end = '\['
   s = df["Information"].iloc[i]
   Name.append(s[s.find(start)+len(start):s.rfind(end)])
df["Name"] = Name

Вывод, который я получаю во вновь созданном столбце имени:

[" Tom [Age] 22 [Height] 6'", " Ben [Height] 6'", "  Mike [Height] 6'"]

Однако я хотел бы, чтобы вывод был:

["Tom", "Ben", "Mike"]

Я также пробовал подобный цикл с использованием Regex и не могу получить желаемый результат.

Спасибо за помощь!

Ответы [ 3 ]

1 голос
/ 23 мая 2019

Вот способ использования str.extract:

df['Name'] = df.Information.str.extract(r'(?<=\[Name\])\s((?:\s*\w+)+)')

print(df)
              Information              Name
0   [Name] Tom [Age] 22 [Height] 6'2   Tom
1   [Age] 21 [Name] Ben [Height] 6'0   Ben
2  [Age] 20 [Name] Mike [Height] 6'3  Mike
1 голос
/ 23 мая 2019

Вы также можете извлечь данные, используя разделение и понимание списка:

[s.split("[Name]",1)[-1].split("[")[0].strip() for s in Info["Information"]]

# ['Tom', 'Ben', 'Mike']

РЕДАКТИРОВАТЬ

Я провел несколько тестов с альтернативными методами, но все они принимаютПримерно в то же время (с 3 миллионами элементов в списке):

Использование split (): 1,47 сек

[s.split("[Name]",1)[-1].split("[",1)[0].strip() for s in Info["Information"]]

Использование скомпилированного регулярного выражения: 1,49 сек

import re
findName = re.compile(r".*\[Name\] (.+?) \[.*")
[findName.match(s).group(1) for s in Info["Information"]]

Использование функции index (): 1,41 с

[s[i+7:s.index(" [",i)] for s in Info["Information"] for i in [s.index("[Name] ")] ]

Избегание полосы () в подходе split (): 1,27 с

[s.split("[Name] ",1)[-1].split(" [",1)[0] for s in Info["Information"]]
1 голос
/ 23 мая 2019
df['Name']=df['Information'].str.extract(r'\[Name\] (\w*)')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...