Существует ли регулярное выражение для добавления первых 4 символов в конец строки и последних 4 символов в начало строки?

#regex #notepad

#регулярное выражение #notepad

Вопрос:

У меня есть несколько строк, которые мне нужно изменить. Это последовательности белков. Как бы мне скопировать первые 4 символа строки в конец строки, а также скопировать последние 4 символа в начало строки? Строки являются переменными, что усложняет задачу, например:

>X

LTGLGIGTGMAATIINAISVGLSAATILSLISGVASGGAWVLAGAKQALKEGGKKAGIAF

>Y

LVATGMAAGVAKTIVNAVSAGMDIATALSLFSGAFTAAGGIMALIKKYAQKKLWKQLIAA

Более того, как я мог исключить строки с ‘>’ в начале (это имена соответствующей последовательности)?

Кто-нибудь знает регулярное выражение, которое позволит этому работать?

Я уже пробовал некоторые решения для регулярных выражений, но у меня не очень большой опыт в такого рода вещах, и я могу найти конечную строку, но не могу заставить ее заменить:

Найти:

(…)$

Заменить:

^$2$1″

Примером того, чего я хочу достичь, является:

>1

ABCDEFGHIJKLMNOPQRSTUVWXYZ

становится:

>1

WXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCD

Спасибо

Ответ №1:

Попробуйте выполнить поиск в режиме регулярного выражения по следующему шаблону:

 ^([A-Z]{4}).*([A-Z]{4})$
  

Затем замените первые четыре и последние четыре символа местами:

 $2$0$1
  

ДЕМОНСТРАЦИЯ

Комментарии:

1. Кроме того, поскольку NP использует регулярные выражения, совместимые с perl, вы можете немного сократить его: ^(w{4})(w )(w{4})$

2. @Trix Но в этом случае я бы предпочел ограничиться заглавными буквами, поскольку последовательности белков OP, вероятно, будут содержать только их, а не другие символы word.

3. Это близко, но я думаю, вы пропустили, что OP хочет скопировать блоки символов, а не просто поменять их местами. Пример следует заменить на WXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCD , как указано в вопросе. Ваше решение перемещает блоки, но не копирует их, предоставляя WXYZEFGHIJKLMNOPQRSTUVABCD .

4. @EdCottrell Мне нужно было только изменить замену на $3$0$1 .

5. @TimBiegeleisen Да. Я не хотел менять суть вашего поста за вас, но я подумал, что вы сделаете переключение, когда увидите это. Хороший, понятный ответ. Есть 1.

Ответ №2:

Вы можете использовать приведенное ниже регулярное выражение.

 ^(([A-Z]{4})([A-Z]*)([A-Z]{4}))$

^ asserts the position at the start of the line, so nothing can come before it.
( is the start of a capture group, this is group 1.
( is the start of a capture group, this is group 2. This group is inside group 1.
[A-Z]{4} means exactly 4 capital characters from A to Z.
) is the end of capture group 2.
( is the start of a capture group, this is group 3.
[A-Z]* matches capital characters from A to Z between zero and infinite times.
) is the end of capture group 3.
( is the start of a capture group, this is group 4.
[A-Z]{4} means exactly 4 capital characters from A to Z.
) is the end of capture group 4.
$ asserts the position at the end of the line, so nothing can come after it.
  

Посмотрите, как это работает с заменой здесь:https://regex101.com/r/W786uL/3.

 $4$1$2

$4 means put capture group 4 here. Which is the last 4 characters.
$1 means put capture group 1 here. Which is everything in the entire string.
$2 means put capture group 2 here. Which is the first 4 characters.
  

Ответ №3:

Вы можете использовать

 ^(.{4})(.*?)(.{4})$
  
  • ^ — начало sting
  • (.{4}) — Сопоставьте любые символы, кроме новой строки
  • (.*?) — Сопоставление любого символа с нулем или более раз (отложенный режим)
  • $ — Конец строки

ДЕМОНСТРАЦИЯ

Комментарии:

1. В этом случае вам не нужно делать точку ленивой.

2. Данные состоят только из символов word, и спрашивающий специально просит не сопоставлять строки, начинающиеся с >