2009-09-21 2 views
0

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

gatename #outputs #inputs list_of_inputs_separated_by_spaces * gate_id 

example: 
nand 3 2 10 11 * G0 (The two inputs to the nand gate are 10 and 11) 
or 2 1 10 * G1 (The only input to the or gate is gate 10) 

Что мне нужно сделать, это переименовать содержимое таким образом, что я устранить столбец #outputs так, чтобы конечный результат:

gatename #outputs list_of_inputs_separated_by_spaces * gate_id 
nand 2 10 11 * G0 
or 1 10 * G1 

Я попытался с помощью поиска и функции Eclipse (параметр находки регулярного выражения утверждения, которое не работает) заменить, но в конечном итоге портя gatename. Я рассматриваю возможность использования сценария Python и итерации по каждой строке текстового файла. мне нужна помощь в определении того, что соответствует соответствующему выражению regex.

ответ

1

Вы действительно можете использовать находку в Eclipse и заменить функцию, используя следующее:

Find: ^([a-z]+) \d 
Replace with: \1 

Это, по существу, соответствуя gatename в начале каждого line (^([a-z]+)), за которым следует выход (\d), и заменяя его только совпадающим именем gatename (\1).

1

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

Просто пройдите через файл, разделите его на символ «», а затем просто опустите вторую запись.

2

Что-то вроде ...:

for theline in fileinput.input(inplace=1): 
    print re.sub(r'(\w+\s*+)\d+\s+(.*)', r'\1\2', theline), 

... должны соответствовать вашим потребностям.

0

Я не знаю, на какой платформе вы используете Eclipse, но если это Linux или у вас есть cygwin, вырезать очень быстро!

cut -d" " --complement -f2 $FILE 

Это будет использовать пробел в качестве разделителя и выбрать дополнение к второму полю.

Если вы действительно хотите использовать регулярное выражение, вы можете сделать что-то вроде этого:

sed -r 's/^ *([^ ]+) +[^ ]+ +(.+)/\1 \2/' $FILE 

Вы можете легко использовать такое же выражение в Python или Perl, конечно, но Митчел прямо - расщепление легко , (Если текст слишком длинный, и он будет тратить время на ненужное разделение других полей).

+0

Я бы предложил изменить все звездочки в этом регулярном выражении плюс знаки - вам нужно хотя бы одно пространство, чтобы разграничить столбцы и по крайней мере одно непространственное, чтобы * быть * столбцом. Это значительно ускорит работу, если встретится с линиями, которые не совпадают. –

+0

Небрежная ошибка с моей стороны, спасибо. – Cascabel

4

Это в основном то, что утилита cut для:

cut -d " " -f 1,3- 

(обновление:. Я забыл вариант -f, извините)

Это берет файл, рассматривает поля разделяются пробелами, и выходы первое, третье и следующее.

(Если вы на Windows, вы должны иметь эти unix-style utilities в любом случае, они могут быть невероятно полезны.)

Использование регулярных выражений, вы можете заменить (\w+) \d+ (.*) с $1 $2.Что-то вроде:

sed -r -e "s/([^ ]+) [0-9]+ (.*)/\1 \2/" file 

или

perl -p -e "s/(\w+) \d+ (.*)/\1 $2/" file 
Смежные вопросы