【问题标题】:how to get scala string split to match python如何让scala字符串拆分以匹配python
【发布时间】:2015-05-02 22:24:26
【问题描述】:
我正在使用 spark-shell 和 pyspark 对一篇文章进行字数统计。 scala flatmap on line.split(" ") 和 python split() 获得不同的字数(scala 有更多)。我在 scala 代码中尝试了 split(" +") 和 split("\W+") ,但无法让计数降到与 python 相同。
有人知道什么模式会与 python 完全匹配吗?
【问题讨论】:
标签:
python
scala
split
apache-spark
【解决方案1】:
Python 的 str.split() 对默认分隔符有一些特殊行为:
连续的空格被视为单个分隔符,如果字符串有前导或尾随空格,则结果将在开头或结尾不包含空字符串。因此,使用None 分隔符拆分空字符串或仅包含空格的字符串将返回[]。
例如,' 1 2 3 '.split() 返回['1', '2', '3']
在 Scala 中完全匹配它的最简单方法可能是这样的:
scala> """\S+""".r.findAllIn(" 1 2 3 ").toList
res0: List[String] = List(1, 2, 3)
scala> """\S+""".r.findAllIn(" ").toList
res1: List[String] = List()
scala> """\S+""".r.findAllIn("").toList
res2: List[String] = List()
另一种方法是预先trim()字符串:
scala> " 1 2 3 ".trim().split("""\s+""")
res3: Array[String] = Array(1, 2, 3)
但这与 Python 处理空字符串的行为不同:
scala> "".trim().split("""\s+""")
res4: Array[String] = Array("")
在 Scala split() 中,空字符串返回一个包含 one 元素的数组,但在 Python 中,结果是一个包含 零 个元素的列表。