/ / Сплит линия, базирана на регекс в Джулия - регекс, юлия-ланг

Разделителна линия, базирана на регекс в Джулия - regex, julia-lang

Интересувам се да разделям ред, използвайки редовен израз в Джулия. Входът ми е корпус във формат LDA-C на Blei, състоящ се от docId wordID : wordCNT Например документ с пет думи е представен, както следва:

186 0:1 12:1 15:2 3:1 4:1

Търся начин за агрегиране на думи и техните числа в отделни масиви, т.е. желаният от мен резултат:

words =  [0, 12, 15, 3, 4]
counts = [1,  1,  2, 1, 1]

Опитах да използвам m = match(r"(d+):(d+)",line), Той обаче намира само първата двойка 0:1, Търся нещо подобно на Python re.compile(r"[ :]").split(line), Как бих разделила линия въз основа на регекс в Джулия?

Отговори:

6 за отговор № 1

Тук няма нужда да използвате регекс; Джулия " split функция позволява използването на няколко знака, за да се определи къде трябва да се появят разделянията:

julia> split(line, [":"," "])
11-element Array{SubString{String},1}:
"186"
"0"
"1"
"12"
"1"
"15"
"2"
"3"
"1"
"4"
"1"

julia> words = v[2:2:end]
5-element Array{SubString{String},1}:
"0"
"12"
"15"
"3"
"4"

julia> counts = v[3:2:end]
5-element Array{SubString{String},1}:
"1"
"1"
"2"
"1"
"1"

4 за отговор № 2

Открих eachmatch метод, който връща итератор за съвпаденията на регекс. Алтернативно решение е да се повтаря всеки мач:

words, counts = Int64[], Int64[]
for m in eachmatch(r"(d+):(d+)", line)
wd, cnt = m.captures
push!(words,  parse(Int64, wd))
push!(counts, parse(Int64, cnt))
end

1 за отговор № 3

Като Мат Б, споменава, тук няма нужда от Regex като лилията на Джулия сплит () може да използва масив от знаци.

Обаче - когато има е нужда от Regex - същата split () функция просто работи, подобно на това, което предлагат другите тук:

line = "186 0:1 12:1 15:2 3:1 4:1"
s = split(line, r":| ")
words = s[2:2:end]
counts = s[3:2:end]

Наскоро трябваше да направя точно това в някакъв код за обработка на Unicode (където разделените знаци - където "комбиниран символ", като по този начин не е нещо, което може да се побере в Юлия "единични кавички"), което означава:

split_chars = ["bunch","of","random","delims"]
line = "line_with_these_delims_in_the_middle"
r_split = Regex( join(split_chars, "|") )
split( line, r_split )