我有一个需要写入磁盘的数据帧,但是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
答案 0 :(得分:2)
问题在于{}
和()
都是正则表达式元字符,并且具有特殊含义。也许编写逻辑的最简单方法是使用模式:
[,;{}()\n\t=]
这是为了匹配PySpark不允许在标题中出现的文字字符。
a = re.match("[,;{}()\n\t=]", 'a s')
print(a)
如果要删除这些字符,可以尝试使用re.sub
:
header = '...'
header = re.sub(r'[,;{}()\n\t=]+', '', header)
答案 1 :(得分:1)
如果您要检查文本是否包含“禁止”的任何
字符,则必须将它们放在[
和]
之间。
您的正则表达式的另一个缺陷是“普通”字符串(不是 r-strings ) 任何反斜杠应加倍。
因此将您的正则表达式更改为:
"[,;{}()\\n\\t= ]"
或使用 r-string :
r"[,;{}()\n\t= ]"
请注意,我还包括了一个空格,您错过了它。
再说一遍:{}
和()
具有特殊含义,但外部 [...]
。
在[
和]
之间,它们表示自己,因此不需要
加上反斜杠。
答案 2 :(得分:1)
正如已经说明的,您可以使用正则表达式来查找禁止的字符,我想补充一点,您可以在不使用正则表达式的情况下执行以下操作:
kubectl get svc,pods --all-namespaces |egrep -e 'kube-dns|default'
请注意,使用这种方法不必担心转义特殊正则表达式字符,例如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
。