2015-10-28 4 views
1

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

кадров в последовательности, как правило, имеют минимальный отступ 3, и будет предваряться либо '.' или '_' Исключение: если имя файла состоит только из ряда и расширение .jpg (например 0001.jpg, 0002.jpg , и т.д.). Я бы хотел записать все это в одной строке регулярного выражения, если это возможно.

Вот что я до сих пор:

(.*?)(.|_)(\d{3,})(.*)\.jpg 

Теперь я знаю, что это не делает «предваряется . или _» бита, а вместо этого просто находит . или _ в любом месте строки в положительный результат. Я пробовал немного отрицательного тестирования lookbehind, но не могу заставить синтаксис работать.

Образец данных:

test_canon_shot02.jpg 
test_shot01-04.jpg 
test_shot02-03.jpg 
test_shot02-02.jpg 
test_shot01-03.jpg 
test_canon_shot03.jpg 
test_shot01-02.jpg 
test_shot02.jpg 
test_canon_shot02.jpg 
test_shot01.jpg 
GameAssets_.00024.jpg 
GameAssets_.00023.jpg 
GameAssets_.00022.jpg 
GameAssets_.00021.jpg 
GameAssets_.00020.jpg 
GameAssets_.00019.jpg 
GameAssets_.00018.jpg 
GameAssets_.00017.jpg 
GameAssets_.00016.jpg 
GameAssets_.00015.jpg 
GameAssets_.00014.jpg 
GameAssets_.00013.jpg 
GameAssets_.00012.jpg 
GameAssets_.00011.jpg 
GameAssets_.00010.jpg 
GameAssets_.00009.jpg 
GameAssets_.00008.jpg 
GameAssets_.00007.jpg 
GameAssets_.00006.jpg 
GameAssets_.00005.jpg 
GameAssets_.00004.jpg 
GameAssets_.00003.jpg 
GameAssets_.00002.jpg 
GameAssets_.00001.jpg 
GameAssets_.00000.jpg 
OrangeXmas2015_Print_A ct2.jpg 
sh120_HF_V01-01.jpg 
sh120_HF_V01-02.jpg 
sh200_DMP_v04.jpg 
sh120_HF_V04.jpg 
sh120_HF_V03.jpg 
sh120_HF_V02.jpg 
blah_v02.jpg 
blah_v01.jpg 
blah_Capture0 4.jpg 
blah_Capture03 .jpg 
blah_Capture01. jpg 
blah_Capture02.jpg 
Wall_GraniteBlock_G rey_TC041813.jpg 
Renders10_wire.jpg 
Renders10.jpg 
Renders09_wire.jpg 
Renders09.jpg 
Renders08_wire.jpg 
Renders08.jpg 
Renders07_wire.jpg 
Renders07.jpg 
Renders06_wire.jpg 
Renders06.jpg 
Renders05_wire.jpg 
Renders05.jpg 
Renders04_wire.jpg 
Renders04.jpg 
Renders03_wire.jpg 
Renders03.jpg 
Renders02_wire.jpg 
Renders02.jpg 
Renders01_wire.jpg 
Renders01.jpg 
archmodels58_057_carpinusbetulus_leaf_diffuse.jpg 
archmodels58_042_bark_bump.jpg 
archmodels58_023_leaf_diffuse.jpg 
WINDY TECHNICZNE-reflect00.jpg 
archmodels58_057_leaf_opacity.jpg 
archmodels58_057_bark_reflect.jpg 
archmodels58_057_bark_bump.jpg 
blahC-00-oknaka.jpg 
bed 
debt 
cab 
00018.jpg 
00017.jpg 
00016.jpg 
00015.jpg 
00014.jpg 
00013.jpg 
00012.jpg 
00011.jpg 
00010.jpg 
00009.jpg 
00008.jpg 
00007.jpg 
00006.jpg 
00005.jpg 
00004.jpg 
00003.jpg 
00002.jpg 
00001.jpg 
00000.jpg  

В результате я после 2 последовательности идентифицированы:

  1. GameAssets_.00000.jpg к GameAssets_.00024.jpg
  2. 00000.jpg к 00018.jpg
+0

'|' эквивалентно '- возможно, вы имели в виду' [._] '(_.) (.)? –

+0

Итак, почему 'archmodels58_057_bark_bump.jpg' не подходит? Он имеет трехзначное число, которому предшествует '_'. Есть ли правило, которое можно использовать для его исключения? –

+0

Да, абсолютно правильно - он тоже должен быть возвращен. Мне пришлось бы разбить его другим тестом, чтобы убедиться, что файл фактически является частью последовательности. – DaveW

ответ

1

Based о правилах, которые вы специфицируете маньяков в вашем вопросе, эта модель должна выполнить то, что вам нужно:

(^|\r?\n|.*_|.*\.)\d{3,}.*\.jpg 
+0

Amazing. Благодаря! – DaveW

+0

regex101.com тестер показывает, что регулярное выражение соответствует этим именам: archmodels58_057_carpinusbetulus_leaf_diffuse.jpg archmodels58_042_bark_bump.jpg archmodels58_023_leaf_diffuse.jpg archmodels58_057_leaf_opacity.jpg archmodels58_057_bark_reflect.jpg archmodels58_057_bark_bump.jpg –

+0

@DavidCullen Согласен, но в соответствии с DaveW в своем комментарии выше , то есть желаемый результат.Если есть какие-либо дополнительные правила, которые могут применяться для пропуска этих совпадений, он не предоставил их. –

0
for item in re.findall(r'.*?[._]?0{3,}.*',data): 
    print(item) 

GameAssets_.00024.jpg 
GameAssets_.00023.jpg 
GameAssets_.00022.jpg 
GameAssets_.00021.jpg 
GameAssets_.00020.jpg 
GameAssets_.00019.jpg 
GameAssets_.00018.jpg 
GameAssets_.00017.jpg 
GameAssets_.00016.jpg 
GameAssets_.00015.jpg 
GameAssets_.00014.jpg 
GameAssets_.00013.jpg 
GameAssets_.00012.jpg 
GameAssets_.00011.jpg 
GameAssets_.00010.jpg 
GameAssets_.00009.jpg 
GameAssets_.00008.jpg 
GameAssets_.00007.jpg 
GameAssets_.00006.jpg 
GameAssets_.00005.jpg 
GameAssets_.00004.jpg 
GameAssets_.00003.jpg 
GameAssets_.00002.jpg 
GameAssets_.00001.jpg 
GameAssets_.00000.jpg 
00018.jpg 
00017.jpg 
00016.jpg 
00015.jpg 
00014.jpg 
00013.jpg 
00012.jpg 
00011.jpg 
00010.jpg 
00009.jpg 
00008.jpg 
00007.jpg 
00006.jpg 
00005.jpg 
00004.jpg 
00003.jpg 
00002.jpg 
00001.jpg 
00000.jpg 
+0

Пытается точно разобраться, почему он не возвращает archmodels58_057_carpinusbetulus_leaf_diffuse.jpg например? – DaveW

+0

Я вижу - это работает только в том случае, если числа находятся в конце имени файла ... Посмотрите на usecase и посмотрите, является ли это жизнеспособным. Спасибо за ответ! – DaveW

0

Попробуйте

(.*?)(\.|_?)(000\d{0,})(.*)\.jpg 

Обратите внимание, что я должен был избежать '.' во второй группе. Кроме того, я должен был выполнить поиск по '.' и '_' по выбору во второй группе. Наконец, мне пришлось добавить минимальное дополнение к третьей группе.

Я использовал regex101.com, чтобы проверить и уточнить регулярное выражение: regex101