#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, и спрашивающий специально просит не сопоставлять строки, начинающиеся с
>