Регулярное выражение для переноса совпадающих строк в знаках фунта, но без пробелов - PullRequest
1 голос
/ 02 марта 2010

Есть ли регулярное выражение, которое я мог бы использовать в функции Найти / Заменить моего текстового редактора (Jedit), чтобы сделать следующее:

Соответствует любым строкам в текстовом файле, которые соответствуют этим критериям:

  1. Строка заканчивается закрывающей скобкой
  2. Открывающая скобка существует где-то в той же строке

Если он совпадает, мне нужно обернуть весь текст в строке - но не пробелы в начале строки - внутри # знаков.

Пример 1

Эта строка:

Total reimbursements (before end of Q1)

необходимо заменить следующим:

#Total reimbursements (before end of Q1)#

Пример 2 (начальные пробелы)

Эта строка (где перед словом Всего есть пробел):

                             Total reimbursements (before end of Q1)

необходимо заменить следующим (знак # ставится перед первой буквой в строке):

                             #Total reimbursements (before end of Q1)#

но НЕ с этим:

#                             Total reimbursements (before end of Q1)#

Пример текстового файла:

Base Expenses
&&&&&&&&&&&&&&&&&&&&&&&


Provides options towards multilateral improvements

Opening Debt(Option patterns)
          A copy provided externally

Customer Summary
&&&&&&&&&&&&&&&&&&&&&&&&&

 External Console(foreign debt)
          Provide execution amounts
 Internal Console(domestic debt)
          Release to appropriations committee

Explanations provided to external clients

 Neutralized Amounts()
          Forex portion

Ответы [ 4 ]

2 голосов
/ 02 марта 2010

Regex:

^([ \t]*)(.*\(.*\))$

Замена:

$1#$2#

Самое хитрое - убедиться, что ни одна часть регулярного выражения не может соответствовать символам новой строки. Вот почему я использовал [ \t]* вместо \s* и .* вместо [^(]* или [^)]*.

2 голосов
/ 02 марта 2010

Я сделал это:

regex = /^(\s*)(.*)\((.*)\)$/

и напечатал $ 1 # $ 2 ($ 3) # на совпадении.

1 голос
/ 02 марта 2010

UPDATE

Хорошо, [^(]+ в флаге regex по умолчанию в jEdit, тоже съел \n (я не вижу опций для установки многострочного флага в интерфейсе поиска / замены jEdit),

Итак, вот новый, подтвержденный вашим обновленным текстом

Поиск: ^(\s*)([^(\n]+\([^)\n]*\))\s*$
Заменить: $1#$2

--- предыдущий ответ ---

Джедит,

Поиск: ^(\s*)([^(]+\([^)]+\))\s*$
Заменить: $1#$2

--- предыдущий предыдущий ответ ---

Python, '^(\s*)([^(]+\([^)]+\))\s*$'

>>> import re
>>>
>>> re.sub('^(\s*)([^(]+\([^)]+\))\s*$','\\1#\\2','Total reimbursements (before end of Q1)')
'#Total reimbursements (before end of Q1)'
>>>
>>> re.sub('^(\s*)([^(]+\([^)]+\))\s*$','\\1#\\2','                             Total reimbursements (before end of Q1)')
'                             #Total reimbursements (before end of Q1)'
  • при условии, что в строке есть только одна скобка
  • \s* в конце не понадобится, если есть конечные пробелы
  • вам, вероятно, также понадобится флаг re.MULTILINE, если вы хотите обрабатывать несколько строк за один выстрел.
0 голосов
/ 02 марта 2010

Попробуйте следующее:

^\s*(?=((.*)(?<=\((.*)\))$))|(?<=\((.*)\))$

Он смотрит вперед и назад, чтобы сопоставить строки с закрывающей скобкой в ​​конце строки, только если ей предшествует открывающая скобка.

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

...