LINUX.ORG.RU

Поиск определенной последовательности

 ,


0

1

Всем привет добрые люди.У меня тут возникла проблема с решением одной задачки и звучит она так:One small letter,surrouned by three EXACTLY big bodyguads on each of it side[Существует такая последовательность это точно].Т.е мне нужно в данном тексте найти последовательность типа XXX[a-z]XXX.Написал код на python с import re.Получил список найденных,но они не подходят.Так как я ток седня для себя открыл что такое регулярные выражение то тупо написал вот так:

re.search('[a-z0-9][A-Z][A-Z][A-Z][a-z][A-Z][A-Z][A-Z][a-z0-9]',text[row])
Управился за 0.1сек



Последнее исправление: keekdown (всего исправлений: 1)

Молодец! А теперь убери тег «дебиан» 😾

darkenshvein ★★★★★
()
Ответ на: комментарий от NeXTSTEP

Слушайте,а вы правы)Получилась последовательность маленьких букв linkedlist

keekdown
() автор топика

Хошь питоном и регулярками?

На:

re.search('[A-Z]{3}([a-z])[A-Z]{3}', your_string_here).group(1)

anonymous
()
Ответ на: комментарий от anonymous

Да,спасибо,ваша запись более коротка,кому-нить интересны посмотреть другие решения этой задачи?

keekdown
() автор топика

Похоже на pychallenge, у них вроде форум, где можно попросить небольшую подсказку.

anonymous
()
Ответ на: комментарий от emulek

PS: это если по одной в каждой строке искать.

а можно и не по одной:

$ sed -rn 's/[A-Z]{3}[a-z][A-Z]{3}/±&/g;s/^[^±]*±/±/;T;s/±(\w{7})[^±]*/\1\n/g;s/\n[\n]*$//;p' text.txt |wc
    477     477    3816

emulek
()
Ответ на: комментарий от emulek

three EXACTLY big bodyguads

.*([A-Z]...

Рановато вам на написание документации замахиваться. Таки выделено - на невнимательность съехать будет сложно.

anonymous
()
Ответ на: комментарий от anonymous

three EXACTLY big bodyguads .*([A-Z]...

Рановато вам на написание документации замахиваться. Таки выделено - на невнимательность съехать будет сложно.

я сразу признаюсь: в английском я не очень. Что тут написано?

посмотрел в словаре:


exactly-наречие
	
точно exactly, precisely, accurately, just, definitely, for sure
	
именно exactly, namely, precisely, just, videlicet
	
ровно smooth, exactly, flat, level, even, smoothly
	
как раз just, exactly, right, even as, even, bang
	
точь-в-точь exactly
	
совершенно верно exactly, precisely, just so

ЧЯДНТ?

emulek
()
Ответ на: комментарий от emulek

Ну отлично, единственно подходящее под «%s big bodyguads» - это «ровно». Или скрипт таки отвергнет AAAAzAAA?

anonymous
()
Ответ на: комментарий от anonymous

Тут фразировка идиотская — не поймешь, то ли им РОВНО 3 надо, то ли 3 ТОЧНО ЗАГЛАВНЫХ. Первое по порядку слов не подходит, а второе по общему тупняку. Если надо ровно 3 заглавных, то /[^A-Z][A-Z]{3}[a-z][A-Z]{3}[^A-Z]/, плюс ассершены по желанию, а тупнячно-интерпретированный вариант уже виднелся выше по треду.

arturpub ★★
()
Ответ на: комментарий от arturpub

[^A-Z]

1) Вообще-то либо гнутое \b, либо отдельные варианты для ^ $.

2) В одной строке может быть несколько - придется дополнительно сношаться, хотя с тем же hold-buffer.

3) Даже без этих оговорок гнутый grep -o .. | cut -c4 будет лаконичнее.

anonymous
()
Ответ на: комментарий от anonymous

1) Вообще-то либо гнутое \b

Пардон, это тоже не катит.

anonymous
()
Ответ на: комментарий от anonymous

\b не выстрелит после z в zXXXaXXX. Правильно variable length positive look-behind [^A-Z]?, но как его готовить в этом вашем шелле я не знаю.

arturpub ★★
()
Ответ на: комментарий от anonymous

В принципе, если движок регулярок возвращает индексы, то кормить ему индекс следующий за 'а' из ХХХаХХХ — не проблема. В перле нулевой ассерт за 'a' тоже должен разрулить /g. Чо там в питонах и седах на эту тему — фиг знает, возможно и пролет.

arturpub ★★
()
Ответ на: комментарий от arturpub

\b не выстрелит после z в zXXXaXXX

Уже поправился, не переживай. Пойнт в том, что исходный sed-скрипт крив.

но как его готовить в этом вашем шелле я не знаю

Зато я знаю, что GNU-ERE могут (^|[^A-Z]) (и да, потом не cut, a grep -o '[a-z]').

anonymous
()
Ответ на: комментарий от anonymous

grep -o '[a-z]'

Ой.. опять недосмотрел)), ну не суть, дальше просто причесывается.

anonymous
()
Ответ на: комментарий от anonymous

AAAAzAAA?

а... Там разве имеется ввиду, что больших букв надо именно три что-ли? Нет, мой скрипт четыре тоже пропустит, но это не проблема:

$  sed -rn 's/^(.*([^A-Z]))?([A-Z]{3}[a-z][A-Z]{3})(([^A-Z]).*)?$/\2-\3-\5/p' text.txt
q-IQNlQSL-i
e-OEKiVEY-j
a-ZADnMCZ-q
b-ZUTkLYN-g
u-CNDeHSB-j
k-OIXdKBF-h
d-XJVlGZV-m
g-ZAGiLQZ-x
v-CJAsACF-l
q-KWGtIDC-j
английский для меня не родной, и вчитываться мне лениво. ТСу надо было по-русски учится писать.

emulek
()
Ответ на: комментарий от emulek

Ну проблема с несколькими вхождениями в одной строке остается.

anonymous
()
Ответ на: комментарий от anonymous

Вообще-то либо гнутое \b, либо отдельные варианты для ^ $.

\b не подходит, т.к. не ловит zZ

В одной строке может быть несколько

вот этого в условии не было.

Даже без этих оговорок гнутый grep

ну пусть будет grep, кто против?

emulek
()
Ответ на: комментарий от anonymous

Да я с постом тормозил, только потом увидел. Все равно непонятно, как все перечисленные уже варианты будут искать в 'XXXaXXXbXXXcXXXdXXX-и т.д.'.

arturpub ★★
()
Ответ на: комментарий от emulek

\b не подходит, т.к. не ловит zZ

arturpub может и второе сообщение не видел, а тут попахивает выборочным цитированием)

вот этого в условии не было

Условие как-то подразумевает, что вхождения в отдельных строках?

anonymous
()
Ответ на: комментарий от arturpub

будут искать в 'XXXaXXXbXXXcXXXdXXX-и т.д.'.

можно после каждого zzzzXXXaXXX вставлять \n, потом стирать zzzz, потом искать дальше в цикле. Из твоего примера получится

XXXaXXX
XXXcXXX

emulek
()
Ответ на: комментарий от emulek

Я пока только вот такое придумал. Надо на тупые кейсы еще потестить.

$_ = "XXXaXXXbXXXcXXXdXXXe";

while (/(?:^|\G|[^A-Z]) [A-Z]{3} ([a-z]) (?=[A-Z]{3})/gx) {
    print("$1\n");
}
a
b
c
d

arturpub ★★
()
Ответ на: комментарий от anonymous

\b не подходит, т.к. не ловит zZ

arturpub может и второе сообщение не видел, а тут попахивает выборочным цитированием)

просто мысли вслух.

Условие как-то подразумевает, что вхождения в отдельных строках?

это должно явно оговариваться, ибо очевидно, что возможна неоднозначность если есть несколько совпадений.

emulek
()
Ответ на: комментарий от arturpub

Если уж искать, так все, док...

абычн ищут не для того, что-бы доказать свою «не анскильность», а для того, что-бы вырезать и использовать. А это очевидно невозможно, если конец с головой сросся. ☺

emulek
()
Ответ на: комментарий от arturpub

ну дык тогда надо сразу было задачу чётко ставить. А то у вас тут «чётко», тут «наложилось», хрен поймёшь...

emulek
()
Ответ на: комментарий от arturpub

XXXaXXXbXXXcXXXdXXX

Да, пожалуй, если будут совсем рядов, будет проглатым, ну это уже спорно: ХХХ входит в последовательность с а, не факт, сомнительно что оно может входит в последовательность с d.

anonymous
()
Ответ на: комментарий от emulek

Ну это как смотреть, требуется собственно one small letter, а то, что она там чем-то surrounded — это уже детали. Собственно вырезая ее [small letter] из текста, мы не получим ни пересекающих результатов, ни покусанного головастика.

доказать свою «не анскильность»

Такие нули, как мы с тобой, давно слились и сели в лужу, чо тут доказывать, лал :)

arturpub ★★
()
Ответ на: комментарий от anonymous

Также спорно и то, что, будучи окружением, замыкающий XXX неотделим от последующих поисков, например XXXaXXXXXXbXXX. То есть мы в любом случае теряем 'b' в '-a-b-c-' Я к тому, что если допускать хотя бы долю декларативности в постановке задачи, почему бы не воспринимать ее полностью неимперативной? ;)

На сайте в обсуждении сказано, что надо получить 10 вхождений, а для тестов советуют брать строку, где ХХХ не в начале и не в конце, типа ' XXXaXXX ', что только подтверждает изначальный тупняк. А на что мы надеялись на попсовом quiz'е, а? На рокет сайенс?

arturpub ★★
()
Ответ на: комментарий от arturpub

Ну это как смотреть, требуется собственно one small letter, а то, что она там чем-то surrounded — это уже детали. Собственно вырезая ее [small letter] из текста, мы не получим ни пересекающих результатов, ни покусанного головастика.

да, наверное. Но я всё равно считаю, что моё(первое) решение вполне годно для такого тупого ТЗ.

emulek
()
Ответ на: комментарий от arturpub

:l tl это чевой-то уж?

:l метка с именем l

tl переход на l, если замена выполнена.

emulek
()
Ответ на: комментарий от arturpub

мда, вот они:

$ sed -rn ':l;s/^(.*[^A-Z])?([A-Z]{3}[a-z])([A-Z]{3}([^A-Z]|$))/\1\2\n\3/;tl;tm;:m;s/([^\n]*)(.\n)/\2/g;T;s/\n[^\n]*$//;p' text.txt 
l
i
n
k
e
d
l
i
s
t

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.