Python - Pandas - Удалить содержимое между первым появлением символа и строкой исправления. - PullRequest
1 голос
/ 26 февраля 2020

Представьте, что у меня есть этот фрейм данных:

data = {'Script': ["create table table_name ( col_1 string , col_2 string , col_3 string ) row format serde 'org.apache.hadoop.hive.serde2.lazy.lazysimpleserde' with properties ( 'field.delim' ='\t' , 'serialization.format' ='\t' , 'serialization.null.format'='' ) stored as inputformat 'org.apache.hadoop.mapred.textinputformat' outputformat 'org.apache.hadoop.hive.ql.io.hiveignorekeytextoutputformat' location 'hdfs://nameservice1/table_name'tblproperties ( 'parquet.compress'='snappy' );"]}
df = pd.DataFrame(data)

По сути, содержимое столбца - это DDL:

create table table_name
  (
    col_1 string
  , col_2 string
  , col_3 string
  )
  row format serde 'org.apache.hadoop.hive.serde2.lazy.lazysimpleserde' with properties
  (
    'field.delim'              ='\t'
  , 'serialization.format'     ='\t'
  , 'serialization.null.format'=''
  )
  stored as inputformat 'org.apache.hadoop.mapred.textinputformat' outputformat 'org.apache.hadoop.hive.ql.io.hiveignorekeytextoutputformat' location 'hdfs://nameservice1/table_name'tblproperties
  (
    'parquet.compress'='snappy'
  )

Что мне нужно сделать, это удалить все содержимое между кулак "(" и слово "местоположение". В основном мой ожидаемый результат следующий:

create table table_name
  (
    col_1 string
  , col_2 string
  , col_3 string
  )
  location 'hdfs://nameservice1/table_name'tblproperties
  (
    'parquet.compress'='snappy'
  )

Для этого я пытаюсь использовать подход регулярных выражений:

df['DDL'] = df.Script.str.replace(r")", " } ").str.replace(r'<}^>location+>', "")

Однако результат не был желаемым:

create table table_name
  (
    col_1 string
  , col_2 string
  , col_3 string
  }
  row format serde 'org.apache.hadoop.hive.serde2.lazy.lazysimpleserde' with properties
  (
    'field.delim'              ='\t'
  , 'serialization.format'     ='\t'
  , 'serialization.null.format'='' } stored as inputformat 'org.apache.hadoop.mapred.textinputformat' outputformat 'org.apache.hadoop.hive.ql.io.hiveignorekeytextoutputformat' location 'hdfs://nameservice1/table_name'tblproperties ( 'parquet.compress'='snappy' }
;

Что я делаю неправильно? С моим подходом я пытаюсь извлечь между {и местоположением ...

1 Ответ

1 голос
/ 26 февраля 2020

Вы можете использовать

df['DDL'] = df['Script'].str.replace(r"(?s)^([^)]*)\).*?\b(location)\b", r"\1\2")

См. Демоверсию regex

Подробности

  • (?s) - встроенная опция re.DOTALL, создающая . совпадение символов разрыва строки
  • ^ - начало строки
  • ([^)]*) - Группа 1 (\1 в шаблоне замены): любые 0+ символов кроме )
  • \) - ) char
  • .*? - любые 0+ символов, как можно меньше (*? не - жадный квантификатор)
  • \b(location)\b - Группа 2 (\2 в шаблоне замены) захватывает целое слово location (\b обозначает границы слова)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...