У меня есть фрейм данных, который мне нужно записать на диск, но pyspark не позволяет ни одному из этих символов ,;{}()\\n\\t=
присутствовать в заголовках при записи в виде файла паркета.
Поэтому я написал простой скрипт, чтобы определить, происходит ли это.
import re
for each_header in all_headers:
print(re.match(",;{}()\\n\\t= ", each_header))
Но для каждого заголовка было напечатано None
. Это неправильно, потому что я знаю, что в заголовках моего файла есть пробелы.
Итак, я решил проверить это, выполнив следующие пару строк
a = re.match(",;{}()\\n\\t= ", 'a s')
print(a)
a = re.search(",;{}()\\n\\t= ", 'a s')
print(a)
Это тоже привело к тому, что None
был напечатан.
Я не уверен, что я делаю неправильно здесь.
PS: я использую python3.7
Ваше регулярное выражение соответствует всем этим символам вместе. Вы пробовали токен [
и ]
([,;{}\(\)\\n\\t=])
?
К двум приведенным выше комментариям нам не нужно дважды экранировать такие вещи, как \n
в классе символов, достаточно только одной обратной косой черты. И (){}
вообще не требуют побега.
print((a.groups()))
Вы можете увидеть слова, которые соответствуют вашему шаблону
Проблема в том, что {}
, а также ()
являются метасимволами регулярных выражений и имеют особое значение. Возможно, самым простым способом написать свою логику было бы использование шаблона:
[,;{}()\n\t=]
Это говорит о соответствии символам буквальный, которые PySpark не позволяет присутствовать в заголовках.
a = re.match("[,;{}()\n\t=]", 'a s')
print(a)
Если вы хотите удалить эти символы, вы можете попробовать использовать re.sub
:
header = '...'
header = re.sub(r'[,;{}()\n\t=]+', '', header)
Если вы хотите проверить, содержит ли текст Любые «запрещенного»
символы, вы должны поместить их между [
и ]
.
Еще один недостаток вашего регулярного выражения заключается в том, что в «обычных» строках (не r-струны) любая обратная косая черта должна быть удвоенный.
Поэтому измените регулярное выражение на:
"[,;{}()\\n\\t= ]"
Или используйте r-строка:
r"[,;{}()\n\t= ]"
Обратите внимание, что я также включил пространство, который вы пропустили.
Еще одно замечание: {}
и ()
имеют особое значение, но за пределами[...]
.
Между [
и ]
они представляют себя, поэтому им не нужно
цитата с обратной косой чертой.
Верно. Спасибо. Я отредактировал вопрос, включив в него пробел
Как уже объяснялось, вы можете использовать регулярное выражение для поиска запрещенных символов, я хочу добавить, что вы можете сделать это без использования регулярного выражения следующим образом:
forbidden = ",;{}()\n\t="
def has_forbidden(txt):
for i in forbidden:
if i in txt:
return True
return False
print(has_forbidden("ok name")) # False
print(has_forbidden("wrong=name")) # True
print(has_forbidden("with\nnewline")) # True
Обратите внимание, что при таком подходе вам не нужно заботиться об экранировании специальных символов регулярных выражений, таких как, например, *
.
Вероятно, вам нужен класс персонажа
[,;{}()\\n\\\\t=]
.