【问题标题】:Python regex: having trouble understanding results [duplicate]Python正则表达式:难以理解结果[重复]
【发布时间】:2023-04-04 06:50:02
【问题描述】:

我有一个需要写入磁盘的数据框,但 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\\t=])吗?
  • 对于上述两个 cmets,我们不需要在字符类中对\n 之类的东西进行双重转义,一个反斜杠就足够了。而(){} 根本不需要任何转义。
  • print((a.groups())) 你可以看到与你的模式匹配的单词

标签: python regex


【解决方案1】:

问题在于{}() 是正则表达式元字符,并且具有特殊含义。也许编写逻辑的最简单方法是使用该模式:

[,;{}()\n\t=]

这表示匹配 PySpark 不允许出现在标题中的 literal 字符。

a = re.match("[,;{}()\n\t=]", 'a s')
print(a)

如果您想删除这些字符,可以尝试使用re.sub

header = '...'
header = re.sub(r'[,;{}()\n\t=]+', '', header)

【讨论】:

    【解决方案2】:

    如果你想检查一个文本是否包含任何的“禁止” 字符,你必须把它们放在[]之间。

    您的正则表达式中的另一个缺陷是“普通”字符串(不是 r-strings) 任何反斜杠都应加倍

    所以将你的正则表达式更改为:

    "[,;{}()\\n\\t= ]"
    

    或者使用r-string

    r"[,;{}()\n\t= ]"
    

    请注意,我还包括了一个空格,你错过了。

    再备注:{}()有特殊含义,但在外[...]。 在[] 之间,他们代表自己,所以他们不需要 带反斜杠的引号。

    【讨论】:

    • 对。谢谢。我已编辑问题以包含空格
    【解决方案3】:

    如前所述,您可以使用正则表达式来查找禁用字符,我想补充一点,您可以不使用正则表达式来执行以下操作:

    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
    

    请注意,使用这种方法您不必关心转义特殊正则表达式字符,例如 *

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-03
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多