Разбить строку по первой найденной подстроке - PullRequest
3 голосов
/ 06 июля 2019

Я хочу разделить предложение по определенным словам при первом появлении этих слов.Позвольте мне проиллюстрировать:

message = 'I wish to check my python code for errors to run the program properly with fluency'

Я хочу разделить вышеупомянутое сообщение по первому вхождению for/to/with, следовательно, результат вышеупомянутого сообщения будет check my python code for errors to run the program properly with fluency

Я также хотел бычтобы включить слово, с которым я разделил предложение, чтобы мой окончательный результат был: to check my python code for errors to run the program properly with fluency

Мой код не работает:

import re
message = 'I wish to check my python code for errors to run the program properly with fluency'
result = message.split(r"for|to|with",1)[1]
print(result)

Что я мог сделать?

Ответы [ 5 ]

1 голос
/ 06 июля 2019

на этот вопрос уже был дан ответ: как удалить все символы перед определенным символом в python , но он работает только для одного определенного разделителя, для нескольких разделителей вы должны сначала выяснить, какой из них встречается первым, это можно найти здесь: как я могу найти первое вхождение подстроки в строке Python вы начинаете с первого предположения, у меня нет большого воображения, поэтому давайте назовем его bestDelimiter = firstDelimiter, найтииз позиции его первого вхождения, сохраните позицию в bestPosition = позицию первого вхождения, приступайте к поиску позиций для остальных разделителей, каждый раз, когда вы находите один разделитель, который встречается до текущей BestPosition, вы обновляете обе переменные bestDelimiterи bestPosition, в конце то, что будет первым, будет bestDelimiter, затем перейдите к операции, которая вам нужна, с помощью bestDelimiter

1 голос
/ 06 июля 2019

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

Следующее делает то, что вы хотите:

import re
message = 'I wish to check my python code for errors to run the program properly with fluency'
result = re.search(r'\b(for|to|with)\b', message)
print message[result.start(1):]

Это не использует подстановку, объединение или цикл, а только простой поиск требуемой строки и использование позиционного результата этого.

1 голос
/ 06 июля 2019
message = 'I wish to check my python code for errors to run the program properly with fluency'
array = message.split(' ')
number = 0
message_new = ''
for i in range(len(array)):
    if array[i] == 'to' or array[i] == 'for':
        number=i
        break
for j in range(number,len(array)):
    message_new += array[j] + ' '
print(message_new) 

Выход:

to check my python code for errors to run the program properly with fluency 
0 голосов
/ 06 июля 2019

Сначала можно найти все экземпляры for, to и with, разделить их на нужные значения, а затем соединить и объединить:

import re
message = 'I wish to check my python code for errors to run the program properly with fluency'
vals, [_, *s] = re.findall(r"\bfor\b|\bto\b|\bwith\b", message), re.split(r"\bfor\b|\bto\b|\bwith\b", message)
result = ''.join('{} {}'.format(a, re.sub("^\s+", "", b)) for a, b in zip(vals, s))

Вывод:

'to check my python code for errors to run the program properly with fluency'
0 голосов
/ 06 июля 2019

Я предполагаю, что это простое выражение может просто сделать это

.*?(\b(?:to|for|with)\b.*)

и re.match могут быть самыми быстрыми из этих пяти методов:

Тест с re.findall

import re

regex = r".*?(\b(?:to|for|with)\b.*)"
test_str = "I wish to check my python code for errors to run the program properly with fluency"
print(re.findall(regex, test_str))

Тест с re.sub

import re

regex = r".*?(\b(?:to|for|with)\b.*)"
test_str = "I wish to check my python code for errors to run the program properly with fluency"
subst = "\\1"

result = re.sub(regex, subst, test_str)

if result:
    print (result)

Тест с re.finditer

import re

regex = r".*?(\b(?:to|for|with)\b.*)"

test_str = "I wish to check my python code for errors to run the program properly with fluency"

matches = re.finditer(regex, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches, start=1):

    # FULL MATCH
    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

Тест с re.match

import re

regex = r".*?(\b(?:to|for|with)\b.*)"
test_str = "I wish to check my python code for errors to run the program properly with fluency"

print(re.match(regex, test_str).group(1))

Тест с re.search

import re

regex = r".*?(\b(?:to|for|with)\b.*)"
test_str = "I wish to check my python code for errors to run the program properly with fluency"

print(re.search(regex, test_str).group(1))

Выражение объяснено в верхней правой части этой демонстрации , если вы хотите исследовать или изменить его дальше, а в этой ссылке вы можете посмотреть, как она будет соответствовать против некоторых входных данных, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...