Python正则表达式:无法理解结果

时间:2019-05-22 10:31:39

标签: python regex

我有一个需要写入磁盘的数据帧,但是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

3 个答案:

答案 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