我有以下模式,我可以在 Python 中使用 Pandas 進行決議,但很難將代碼翻譯成 Scala。
grade string_column
85 (str:ann smith,14)(str:frank chase,15)
86 (str:john foo,15)(str:al more,14)
在 python 中,我使用了:
df.set_index('grade')['string_column']\
.str.extractall(r'\((str:[^,] ),(\d )\)')\
.droplevel(1)
輸出:
grade 0 1
85 str:ann smith 14
85 str:frank chase 15
86 str:john foo 15
86 str:al more 14
在 Scala 中,我嘗試復制該方法,但失敗了:
import scala.util.matching.Regex
val pattern = new Regex("((str:[^,] ),(\d )\)")
val str = "(str:ann smith,14)(str:frank chase,15)"
println(pattern findAllIn(str)).mkString(","))
uj5u.com熱心網友回復:
關于代碼有幾點說明:
- 組有一個不匹配的括號,但應該轉義
- 反斜杠應該被雙重轉義
- 在
println您不必使用所有括號和點 - findAllIn回傳一個 MatchIterator,回圈這些將暴露一個匹配的字串。用逗號連接那些匹配的字串,在這種情況下將再次回傳相同的字串。
例如
import scala.util.matching.Regex
val pattern = new Regex("\\((str:[^,] ),(\\d )\\)")
val str = "(str:ann smith,14)(str:frank chase,15)"
println(pattern findAllIn str mkString ",")
輸出
(str:ann smith,14),(str:frank chase,15)
但是如果你想列印出第 1 組和第 2 組的值,你可以使用findAllMatchIn回傳正則運算式匹配的集合:
import scala.util.matching.Regex
val pattern = new Regex("\\((str:[^,] ),(\\d )\\)")
val str = "(str:ann smith,14)(str:frank chase,15)"
pattern findAllMatchIn str foreach(m => {
println(m.group(1))
println(m.group(2))
}
)
輸出
str:ann smith
14
str:frank chase
15
uj5u.com熱心網友回復:
在 Python 中,Series.str.extractall只回傳捕獲的子字串。在 Scala 中,findAllIn如果您不查詢其matchData包含subgroups屬性的屬性,則回傳匹配的值。
因此,要僅在 Scala 中獲取捕獲,您需要使用
val pattern = """\((str:[^,()] ),(\d )\)""".r
val str = "(str:ann smith,14)(str:frank chase,15)"
(pattern findAllIn str).matchData foreach {
m => println(m.subgroups.mkString(","))
}
輸出:
str:ann smith,14
str:frank chase,15
請參閱Scala 在線演示。
此處,m.subgroups訪問每個匹配項 ( m) 的所有子組(捕獲)。
另外,請注意您不需要在三引號字串文字中使用雙反斜杠。\((str:[^,()] ),(\d )\)火柴
\(- 一個(字符(str:[^,()] )- 第 1 組:str:以及除,,(和以外的一個或多個字符),- 逗號(\d )- 第 2 組:一位或多位數字\)- 一個)字符。
如果您只想在沒有捕獲的情況下獲得所有匹配項,則可以使用
val pattern = """\((str:[^,] ),(\d )\)""".r
println((pattern findAllIn str).matchData.mkString(","))
輸出:
(str:ann smith,14),(str:frank chase,15)
請參閱在線演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/389377.html
