2015-07-25 3 views
2

У меня есть строка, которая выглядит как:Python - список карт с регулярными выражениями

(((ENGL 210) or (COMM 243) or (COMM 205)) and (ECEN 314) and (ECEN 325)) 

Я хочу, чтобы преобразовать его в:

((ENGL 210 or COMM 243 or COMM 205) and ECEN 314 and ECEN 325) 

В основном карту все, что в строке формы (cccc ddd) к cccc ddd, где c - персонаж, а номер d - это номер.

Я знаю, что могу извлечь все такие строки, используя re, но я хочу отобразить их обратно в новый формат. Какой будет самый чистый способ сделать это?

Спасибо.

+1

Публиковать код «извлечь все такие строки с использованием re " – jperelli

+0

Извините. Я написал это как: 're.findall (r '(\ (\ w \ w \ w \ w \ d \ d \ d \))', строка)' –

ответ

2
import re 

t = '(((ENGL 210) or (COMM 243) or (COMM 205)) and (ECEN 314) and (ECEN 325))' 
re.sub(r'\(([A-Z]{4} [\d]{3})\)', r'\1', t) 

результате

'((ENGL 210 or COMM 243 or COMM 205) and ECEN 314 and ECEN 325)' 

объяснение, re.sub first argum лор

r' будет определять регулярные expresion внутри одиночных кавычек

\( является соответствием открывающей скобки, это то, который вы хотите удалить

( открытия prenthesis для определения новой «группы».То, что внутри этого будут сохранены в качестве «группы» согласующего как число регулярных выражений группы 1

соответствия группы # 1

[A-Z]{4} матч четыре символа верхнего регистра букв

матч также пространство

[\d]{4} соответствует также четырем цифрам

) близко Номер группы 1

\) близко соответствия скобка (другой, который вы хотите удалить)

' закрыть регулярное выражение

объяснение, re.sub второй аргумент

r' будет определять регулярные expresion внутри одиночных кавычек

\1 восстановить номер группы один согласованный в предыдущем рассуждении

' закрыть регулярное выражение

2

Следующие должны работать:

>>> re.sub(r'\((\w{4} \d{3})\)', r'\1', s) 
'((ENGL 210 or COMM 243 or COMM 205) and ECEN 314 and ECEN 325)' 

re.sub будет соответствовать шаблону, состоящий из:

  • отверстие скобка \(
  • первая группа (...)
    • 4 букв \w{4}
    • пространство
    • три цифры \d{3}
  • и закрывающая скобка \)

Для каждого матча мы заменить его с содержанием первой группы (\1) и мы необходимое результат.

2

Вы можете использовать re.sub сделать это:

>>> import re 
>>> s = '(((ENGL 210) or (COMM 243) or (COMM 205)) and (ECEN 314) and (ECEN 325))' 
>>> re.sub(r'\(([^()]+)\)', r'\1', s) 
'((ENGL 210 or COMM 243 or COMM 205) and ECEN 314 and ECEN 325)' 

И если вы хотите быть строго по формату:

>>> re.sub(r'\((\w+ \d+)\)', r'\1', s) 
Смежные вопросы