Python – регулярное выражение – Разделение строки перед словом

Я пытаюсь разбить строку в python перед определенным словом. Например, я хотел бы разделить следующую строку перед "path:".

  • разделить строку перед "path:"
  • ввод: "path:bte00250 Alanine, aspartate and glutamate metabolism path:bte00330 Arginine and proline metabolism"
  • вывод: ['path:bte00250 Alanine, aspartate and glutamate metabolism', 'path:bte00330 Arginine and proline metabolism']

я пытался

rx = re.compile("(:?[^:]+)")
rx.findall(line)

Это нигде не разбивает строку. Проблема в том, что значения после "path:" никогда не будут известны как определяющие все слово. Кто-нибудь знает как это сделать?


person Dyna    schedule 15.07.2011    source источник


Ответы (3)


использование регулярного выражения для разделения вашей строки кажется немного излишним: строковый метод split() может быть именно тем, что вам нужно.

в любом случае, если вам действительно нужно сопоставить регулярное выражение, чтобы разделить строку, вы должны использовать re.split(), который разбивает строку при совпадении с регулярным выражением.

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

>>> line = 'path:bte00250 Alanine, aspartate and glutamate metabolism path:bte00330 Arginine and proline metabolism'
>>> re.split(' (?=path:)', line)
['path:bte00250 Alanine, aspartate and glutamate metabolism', 'path:bte00330 Arginine and proline metabolism']

группа (?=...) является предварительным утверждением: выражение соответствует пробелу (обратите внимание на пробел в начале выражения), за которым следует строка 'path:', не используя то, что следует за пробелом.

person Adrien Plisson    schedule 15.07.2011
comment
Я не понял, зачем нужны пробелы в регулярном выражении. К счастью, я получил хороший ответ на свои сомнения здесь. Я подозреваю, что у некоторых людей могут быть такие же сомнения, поэтому я публикую ссылку здесь. - person brandizzi; 16.07.2011
comment
Почему это не работает? re.split(" (?=\d)", "User1") дает ['User1'] - person omerfarukdogan; 15.01.2018
comment
@farukdgn простой ответ заключается в том, что ваше регулярное выражение ничему не соответствует в вашей входной строке, то есть вы ищете пробел, за которым следует цифра, но во входной строке нет пробела. чтобы ваше регулярное выражение работало, вам нужно будет удалить пробел, но, как объяснено в ссылке, опубликованной brandizi в приведенном выше комментарии, re.split() не может разбиваться на совпадение с нулевой длиной, поэтому вам нужно будет включить некоторый соответствующий контекст перед опережающим выражением. пробел работал в исходном вопросе, потому что ввод всегда содержал пробел перед строковым путем:. - person Adrien Plisson; 16.01.2018
comment
потому что символ соответствует . расходуется в разбивке. вы явно не понимаете, как работает re.split(), прочитайте документацию. Кроме того, это не имеет ничего общего с исходным вопросом. Если вам нужны дополнительные указания, опубликуйте новый вопрос здесь, в stackoverflow. - person Adrien Plisson; 16.01.2018
comment
@AdrienPlisson Я понял проблему. Вы ответили на вопрос, ошибочно предполагая, что перед каждым path: будет пробел (который не упоминается ни в вопросе, ни в ответе), поэтому я не уделил этой части достаточно внимания. - person omerfarukdogan; 16.01.2018
comment
@farukdgn неправильное предположение? он идеально соответствует вводу, данному OP. не упомянуто в ответе? цитирование: выражение соответствует пробелу (...), за которым следует строка 'path:'. остальное - понять, как re.split() на самом деле разделяется при каждом совпадении с регулярным выражением. - person Adrien Plisson; 16.01.2018
comment
@AdrienPlisson Он говорит, что я пытаюсь разбить строку в python перед определенным словом. в вопросе. В этом примере есть пробелы. Следовательно, это предположение, которое вы сделали (проверьте другие ответы, они не делают предположения). - person omerfarukdogan; 16.01.2018

Вы можете сделать ["path:"+s for s in line.split("path:")[1:]] вместо использования регулярного выражения. (обратите внимание, что мы пропускаем первое совпадение, у которого нет префикса «путь:».

person multipleinterfaces    schedule 15.07.2011

Это можно сделать без регулярных выражений. Дана строка:

s = "path:bte00250 Alanine, aspartate ... path:bte00330 Arginine and ..."

Мы можем временно заменить нужное слово заполнителем. Заполнитель — это один символ, который мы используем для разделения на:

word, placeholder = "path:", "|"
s = s.replace(word, placeholder).split(placeholder)
s
# ['', 'bte00250 Alanine, aspartate ... ', 'bte00330 Arginine and ...']

Теперь, когда строка разделена, мы можем воссоединить исходное слово с каждой подстрокой, используя понимание списка:

["".join([word, i]) for i in s if i]
# ['path:bte00250 Alanine, aspartate ... ', 'path:bte00330 Arginine and ...']
person pylang    schedule 24.08.2017