2013-03-06 4 views
1

Я помогаю кому-то с переименованием файлов на работе с помощью приложения, которое поддерживает синтаксис регулярных выражений python. Я попробовал несколько выражений, найденных на форумах, например, ^[^_]+(?=_) для а) ниже, но он не работал должным образом, а некоторые другие, которые не работали. поэтому я решил, что должен обратиться к тому, кто действительно знает, что они делают. Спасибо за вашу помощь.Три регулярных выражения питона вокруг символов подчеркивания

а) в первом выражении я должен найти все символы до первого подчеркивания в образцах, как это:

cannon_mac_23567_prsln_333 
jones_james_343342_prsln_333 
smith_john_223462_prsln_333 

так, я должен получить пушки, Джоунс и кузнец

б) в отдельном выражении мне нужно найти все символы между первым и вторым подчеркиванием. поэтому, я должен найти mac, james и john в приведенных выше примерах.

с) в последнем выражении я должен найти первый Underscore

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

+0

Вы должны показать, что вы уже пробовали для каждой части. Как ваши попытки не работали? – askewchan

+0

Обновленный мой ответ, должен делать то, что вы хотите сейчас. – msvalkon

ответ

1

Я хотел бы использовать:

1. ^([^_]+)_ 
2. _([^_]+)_ 
3. ^[^_]_ 

Использование re.match, как это соответствует началу строки.

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

+0

это прекрасный. Спасибо! я сделал одну ошибку в моей просьбе. для шага 2 вы можете включить нижнее подчеркивание? например, он найдет «james_», а не «james» – user2141579

+0

. Для этого вам нужно будет помещать знак подчеркивания _inside_ в круглые скобки вместо внешнего. – Mariano

3

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

Использование str.split и index методы.

'smith_john_223462_prsln_333'.split('_')[0] //(to extract smith) 
'smith_john_223462_prsln_333'.split('_')[1] //(to extract john) 
'smith_john_223462_prsln_333'.index('_') //(to get position of first underscore) 
+0

спасибо, но должно быть регулярным выражением. Я использую настольное приложение для переименования файлов, которое поддерживает синтаксис регулярных выражений python. не на самом деле используя python – user2141579

1

Права, я не понял ваш вопрос на первом. В то время как str.split определенно будет более изящным способом решить эту проблему, вот три регулярных выражения в соответствии с вашими потребностями. Я не знаю, будет ли ваше приложение работать с ними. Так что возьмите это с солью.

За дополнительной информацией просьба ознакомиться с библиотекой re и с номером MatchObject.span().

В одном регулярное выражение:

import re 
line = "cannon_mac_23567_prsln_333" 
In [1812]: match = re.match(r"(.+?)(\_)(.+?)\_", line) 

In [1813]: match.groups() 
Out[1813]: ('cannon', '_', 'mac') 

In [1814]: match.span(2)[0] <-- second group, start. The first occurence of _ 
Out[1814]: 6 

In [1815]: line[6] 
Out[1815]: '_' 

Seprated в, Ь, с:

: с

import re 
line = "cannon_mac_23567_prsln_333" 
In [1707]: match = re.match(r"(.+?)\_", line) 

In [1708]: match.groups() 
Out[1708]: ('cannon',) 

б:

In [1712]: match = re.match(r".+\_(.+?)\_", line) 

In [1713]: match.groups() 
Out[1713]: ('prsln',) 

C: Последняя одна использует re.search для простоты.MatchObject.span() возвращает кортеж из положения (start, end)

In [1763]: match = re.search("\_", line) 

In [1764]: match.span()[0] 
Out[1764]: 6 

In [1765]: line[6] 
Out[1765]: '_'