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

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

Я также хотел бы включить слово, с которым я разделил предложение, поэтому мой окончательный результат будет: {{Х0}}

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

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)

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

3
Legion 6 Июл 2019 в 21:55

5 ответов

Лучший ответ

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
M Somerville 6 Июл 2019 в 19:05

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

1
user2555216 6 Июл 2019 в 20:06
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 
1
İsa GİRİŞKEN 6 Июл 2019 в 19:04

Сначала вы можете найти все экземпляры 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
Ajax1234 6 Июл 2019 в 19:04

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

.*?(\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))

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

0
Emma 6 Июл 2019 в 19:42