Python регулярное выражение - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь преобразовать pandas dtypes ==> схему pyspark.

ie. Преобразовать следующий текст

PERSONID      int64
LASTNAME     object
FIRSTNAME    object
ADDRESS      object
CITY         object
RESULT         bool

В

StructField('PERSONID',IntegerType(),True),
StructField('LASTNAME',StringType(),True),
StructField('FIRSTNAME',StringType(),True),
StructField('ADDRESS',StringType(),True),
StructField('CITY',StringType(),True),
StructField('RESULT',BooleanType(),True)

Пока я сделал это:

import re

query = """
PERSONID      int64
LASTNAME     object
FIRSTNAME    object
ADDRESS      object
CITY         object
RESULT         bool
""";

mapping = {'int64': 'IntegerType()',
           'float64': 'DoubleType',
           'bool': 'BooleanType()',
           'object': 'StringType()'
          }


regexp = '(\w+)\s+(\w+)'

re.match(query,regexp)

Я новичок в синтаксисе регулярных выражений.

Как добиться требуемого результата?

1 Ответ

2 голосов
/ 10 марта 2020

Вы можете решить свою проблему без использования регулярных выражений. Регулярные выражения часто являются не самым читаемым решением. Особенно после некоторого времени, когда они не используются или когда выражение представляет собой строку из 50 символов. Синтаксис на чистом языке всегда будет более понятным, и вероятность того, что вы его забудете, будет меньше.

Синтаксическое решение:

Я разделил решение на части, поэтому вы можете изучать его по частям.

query_s = query.rstrip().lstrip()
query_s = query_s.split(sep='\n')
query_s = [ x.split() for x in query_s ]
query_s = [ [x[0], mapping[x[1]]] for x in query_s ]
query_s = [ [ "StructField(\'", x[0], "\',", x[1], ",True)," ] for x in query_s ]
query_s = [ ''.join(x) for x in query_s ]

Решение регулярных выражений:

query_s = query.split(sep='\n')
query_s = [x for x in query_s if x]
query_s = [ ["StructField(\'", re.match(r"^(\w+)\s+(\w+)", x).group(1), "\',", mapping[re.match(r"^(\w+)\s+(\w+)", x).group(2)], ",True)"] for x in query_s ]
out = [''.join(x) for x in query_s]

Вы можете передать вызываемое значение в re.sub, чтобы сделать его более красивым, вы можете написать хорошую функцию для обработки совпадений и передать ее в re.sub()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...