【问题标题】:pyspark regex to match domain\username patternpyspark 正则表达式匹配域\用户名模式
【发布时间】:2019-09-19 18:23:12
【问题描述】:

我在一个数组中有带有域\用户名的字符串。我想匹配它并替换它。

字符串有以下模式:

[, DESKTOP-XXQYY56\Adminaccount, ] [, MB4345XX\adminaccount, ]

我使用的代码如下:

df2= df1.withColumn(
    'str1',
     regexp_replace(
        'str',
        r'^([A-Za-z0-9]+(-[A-Za-z0-9]+)*)+(\\?([A-Za-z0-9])+)*',
        'AB22'
    )
)

我无法正确匹配模式。我想匹配字符串并替换它。请提出建议。

【问题讨论】:

  • 你到底想匹配和替换什么?上面的示例是包含方括号的示例字符串?尝试省略锚^
  • 我的数据格式为 domain\user 例如[, DESKTOP-XXQYY56\Adminaccount, ] [, MB4345XX\adminaccount, ]。我想找到这些数据并将其替换为“XXXX”

标签: regex pyspark


【解决方案1】:

如果您想匹配该格式并将 domain\user 替换为 XXXX,您可以使用 2 个捕获组来打开 [, 和关闭 , ]

您可以省略锚^,在这部分([A-Za-z0-9])+ 中将量词+ 移动到字符类[A-Za-z0-9]+,否则您将重复匹配单个字符的组。

如果您不单独使用捕获组进行进一步处理,您可以将它们变成非捕获组(?:

模式可能看起来像

(\[, )[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*(?:\\?[A-Za-z0-9]+)*(, \])

部分

  • (\[, ) 捕获 第 1 组 匹配 [,
  • [A-Za-z0-9]+ 匹配字符类中列出的任何字符的 1 次以上
  • (?:非捕获组
    • -[A-Za-z0-9]+ 匹配 - 并匹配任何列出的 1 次以上
  • )*关闭非捕获组并重复0+次
  • (?:非捕获组
    • \\?[A-Za-z0-9]+ 匹配可选的 \ 和 1 次以上任何列出的
  • )*关闭非捕获组并重复1次以上
  • (, \]) 捕获 第 2 组 匹配 , ]

在替换中使用 2 个捕获组

$1XXXX$2

Regex demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多