Как я могу использовать Python / регулярное выражение для перемещения одной части строки в другую позицию в строке - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь использовать Python и регулярные выражения, чтобы переупорядочить части input_string ниже, используя ':' и % в качестве опорных точек:

input_string = "old % habits die % hard :(it's difficult to get rid of old habits)"

код должен принимать содержимое из":" до конца строки, а затем переместить этот фрагмент ранее в строку, поместив фрагмент перед вторым % и после последнего слова между % во входном предложении. Все, что было после второй %, но не было частью сообщения: chunk, должно остаться.

ie - строка вывода будет выглядеть примерно так:

"old % habits die:(it's difficult to get rid of old habits)% hard "

Примечание, "chunkвсегда ближе к концу, но порядок, где% chunk не всегда согласован

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

В идеале, regex может сделать всю работу за вас. Таким образом, вы можете использовать группы захвата, которые являются достаточно гибкими и более выразительными и короткими, чем возиться с массивом.

import re

string = "old % habits die % hard :(it's difficult to get rid of old habits)"

# define a regex that makes the groups you need
rgx = r"(.+%)(.+)(%)(.+)(:.+)$"

# just to illustrate, you would get this groups in the regex

re.match(rgx, string).groups()

# output
# ('old %',
# ' habits die ',
# '%',
# ' hard ',
# ":(it's difficult to get rid of old habits)")

# then you only need to declare the new sorting order 
# in the replacement with the use of grouping.
re.sub(rgx,  "\g<1>\g<2>\g<5>\g<3>\g<4>", string)                                                                                      

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

1 голос
/ 30 сентября 2019

Если это всегда так, вы должны использовать что-то вроде следующего:

re.split(r"[\%\:]","*old* % habits die % *hard* **:(it's difficult to get rid of old habits)**")

Это выводит

['*old* ',
 ' habits die ',
 ' *hard* **',
 "(it's difficult to get rid of old habits)**"]

, и вы можете изменить порядок при необходимости и вернуть любые разделители.

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