Давайте посмотрим два эффективных способа, которые касаются экранированных кавычек. Эти шаблоны не предназначены для краткости и эстетики, но для эффективности.
Эти способы используют первую распознавание символов для быстрого поиска котировок в строке без затрат на чередование. (Идея состоит в том, чтобы быстро отбросить символы, которые не являются кавычками, без проверки двух ветвей чередования.)
Содержимое между кавычками описывается с развернутым контуром (вместо повторное чередование): [^"\\]*(?:\\.[^"\\]*)*
Очевидно, чтобы иметь дело со строками, которые не имеют сбалансированных кавычек, вместо этого вы можете использовать собственные квантификаторы: [^"\\]*+(?:\\.[^"\\]*)*+
или обходной путь для имитации их, чтобы предотвратить слишком много назад. Вы также можете выбрать, что цитируемая часть может быть открывающей цитатой до следующей (неэкспертированной) цитаты или конца строки. В этом случае нет необходимости использовать притяжательные квантификаторы, вам нужно только сделать последнее предложение необязательным.
Обратите внимание: иногда кавычки не экранируются с обратной косой чертой, а повторяя цитату. В этом случае подшаблон содержимого выглядит следующим образом: [^"]*(?:""[^"]*)*
Образцы избегают использования группы захвата и обратной ссылки (я имею в виду что-то вроде (["']).....\1
) и используйте простое чередование, но с ["']
в начале, в коэффициенте.
Perl like:
["'](?:(?<=")[^"\\]*(?s:\\.[^"\\]*)*"|(?<=')[^'\\]*(?s:\\.[^'\\]*)*')
(обратите внимание, что (?s:...)
является синтаксическим сахаром для переключения в режиме «dotall / singleline» внутри группы, не содержащей захвата. Если этот синтаксис не поддерживается, вы можете легко включить этот режим для всего шаблона или заменить точку на [\s\S]
)
(Способ написания этого шаблона полностью «ручным» и не учитывает возможные внутренние оптимизации двигателя)
Сценарий ECMA:
(?=["'])(?:"[^"\\]*(?:\\[\s\S][^"\\]*)*"|'[^'\\]*(?:\\[\s\S][^'\\]*)*')
POSIX extended:
"[^"\\]*(\\(.|\n)[^"\\]*)*"|'[^'\\]*(\\(.|\n)[^'\\]*)*'
или просто:
"([^"\\]|\\.|\\\n)*"|'([^'\\]|\\.|\\\n)*'
Ответа на этот вопрос PySpark
Поместить все DataFrames в список
df_list = [df1, df2, df3, df4]
finaldf = reduce(lambda x, y: x.union(y), df_list)
finaldf будет содержать все данные.