# Packages for text matching?

**URL:** <https://discourse.julialang.org/t/packages-for-text-matching/60012>\
**Category:** General Usage\
**Tags:** match, packages, pattern-matching\
**Created:** [April 26, 2021, 3:02am UTC](https://discourse.julialang.org/t/packages-for-text-matching/60012 "2021-04-26T03:02:07Z")\
**Posts on this page:** 16\
**Page:** 1

<div class="post-metadata">

**Author:** ![Lincoln\_Hannah](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lincoln_hannah/32/19198_2.png) [@Lincoln\_Hannah](https://discourse.julialang.org/u/Lincoln_Hannah)\
**Post date:** [April 26, 2021, 3:02am UTC](https://discourse.julialang.org/t/packages-for-text-matching/60012/1 "2021-04-26T03:02:07Z")

</div>

I’d like to write:

`"$(First_Name).$(Last_Name),$(Age)" = "John.Smith,20"`

with result

`(First_Name = "John", Last_Name = "Smith", Age = 20 )`

Any package that supports this pattern matching in text?

---

<div class="post-metadata">

**Author:** ![AndiMD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/andimd/32/6531_2.png) [@AndiMD](https://discourse.julialang.org/u/AndiMD)\
**Post date:** [April 26, 2021, 3:53am UTC](https://discourse.julialang.org/t/packages-for-text-matching/60012/2 "2021-04-26T03:53:11Z")

</div>

This does not directly address your question, but in case you have not considered regex capture groups yet:  
`m=match(r"(?<First_Name>\w+)\.(?<Last_Name>\w+),(?<Age>\d+)", "John.Smith,20")`

---

<div class="post-metadata">

**Author:** ![Lincoln\_Hannah](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lincoln_hannah/32/19198_2.png) [@Lincoln\_Hannah](https://discourse.julialang.org/u/Lincoln_Hannah)\
**Post date:** [April 26, 2021, 5:46am UTC](https://discourse.julialang.org/t/packages-for-text-matching/60012/3 "2021-04-26T05:46:52Z")

</div>

Thanks Andreas.  
That’s a great answer. I wish Regex was less verbose. But I guess it has to be to capture the many possibilities.

Its nice you can then write `m[:Last_Name]`  
Seems you can’t convert m to a dict or named tuple though which is a pity.

---

<div class="post-metadata">

**Author:** ![Skoffer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/skoffer/32/378_2.png) [@Skoffer](https://discourse.julialang.org/u/Skoffer)\
**Post date:** [April 26, 2021, 7:53am UTC](https://discourse.julialang.org/t/packages-for-text-matching/60012/4 "2021-04-26T07:53:38Z")

</div>

But you can, can’t you?

```julia
julia> m=match(r"(?<First_Name>\w+)\.(?<Last_Name>\w+),(?<Age>\d+)", "John.Smith,20")
RegexMatch("John.Smith,20", First_Name="John", Last_Name="Smith", Age="20")

julia> Dict(keys(m) .=> m.captures)
Dict{String, SubString{String}} with 3 entries:
  "First_Name" => "John"
  "Last_Name" => "Smith"
  "Age" => "20"

julia> NamedTuple{Tuple(Symbol.(keys(m)))}(m.captures)
(First_Name = "John", Last_Name = "Smith", Age = "20")

```

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [April 26, 2021, 8:05am UTC](https://discourse.julialang.org/t/packages-for-text-matching/60012/5 "2021-04-26T08:05:26Z")

</div>

Not sure of understanding but this sounds like a meta-programming task.  
Example below:

```julia
str = """First_Name, Last_Name, Age = "John", "Smith", 20 """
eval(Meta.parse(str))

```

resulting in assignments:

```julia
julia> First_Name
"John"
julia> Last_Name
"Smith"
julia> Age
20

```

---

<div class="post-metadata">

**Author:** ![carstenbauer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/carstenbauer/32/4981_2.png) [@carstenbauer](https://discourse.julialang.org/u/carstenbauer)\
**Post date:** [April 26, 2021, 8:07am UTC](https://discourse.julialang.org/t/packages-for-text-matching/60012/6 "2021-04-26T08:07:18Z")

</div>

FWIW: [Parse structured string to dictionary](https://discourse.julialang.org/t/parse-structured-string-to-dictionary/8126)

The Python solution is nice and easy. Would be great to have this in a package!

**Update:**

The example of the OP would just be this in Python:

```python
import parse
templ = "{First_Name}.{Last_Name}.{Age}"
dict = parse.parse(templ, "John.Smith,20")

```

---

<div class="post-metadata">

**Author:** ![Skoffer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/skoffer/32/378_2.png) [@Skoffer](https://discourse.julialang.org/u/Skoffer)\
**Post date:** [April 26, 2021, 8:08am UTC](https://discourse.julialang.org/t/packages-for-text-matching/60012/7 "2021-04-26T08:08:08Z")

</div>

It has few problems.

1. It’ll work only in global scope, which may not be convenient
2. It doesn’t scale well. What if you have file of strings to parse?
3. It’s slow.

---

<div class="post-metadata">

**Author:** ![Lincoln\_Hannah](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lincoln_hannah/32/19198_2.png) [@Lincoln\_Hannah](https://discourse.julialang.org/u/Lincoln_Hannah)\
**Post date:** [April 26, 2021, 8:15am UTC](https://discourse.julialang.org/t/packages-for-text-matching/60012/8 "2021-04-26T08:15:12Z")

</div>

keys(m) doesn’t work for me. I think because m isn’t a dictionary. Am I missing a package ?

---

<div class="post-metadata">

**Author:** ![Skoffer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/skoffer/32/378_2.png) [@Skoffer](https://discourse.julialang.org/u/Skoffer)\
**Post date:** [April 26, 2021, 8:15am UTC](https://discourse.julialang.org/t/packages-for-text-matching/60012/9 "2021-04-26T08:15:52Z")

</div>

Probably it’s Julia version? Which one are you using?

---

<div class="post-metadata">

**Author:** ![Lincoln\_Hannah](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lincoln_hannah/32/19198_2.png) [@Lincoln\_Hannah](https://discourse.julialang.org/u/Lincoln_Hannah)\
**Post date:** [April 26, 2021, 8:17am UTC](https://discourse.julialang.org/t/packages-for-text-matching/60012/10 "2021-04-26T08:17:58Z")

</div>

1.6.0

---

<div class="post-metadata">

**Author:** ![Lincoln\_Hannah](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lincoln_hannah/32/19198_2.png) [@Lincoln\_Hannah](https://discourse.julialang.org/u/Lincoln_Hannah)\
**Post date:** [April 26, 2021, 8:31am UTC](https://discourse.julialang.org/t/packages-for-text-matching/60012/11 "2021-04-26T08:31:22Z")

</div>

This Python parse package seems really cool thanks Carsten.  
Pity about the issues Andrey mentions.

---

<div class="post-metadata">

**Author:** ![Skoffer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/skoffer/32/378_2.png) [@Skoffer](https://discourse.julialang.org/u/Skoffer)\
**Post date:** [April 26, 2021, 8:36am UTC](https://discourse.julialang.org/t/packages-for-text-matching/60012/12 "2021-04-26T08:36:15Z")

</div>

Probably it was added only in 1.7

Then you can do this

```julia
julia> m=match(r"(?<First_Name>\w+)\.(?<Last_Name>\w+),(?<Age>\d+)", "John.Smith,20")
RegexMatch("John.Smith,20", First_Name="John", Last_Name="Smith", Age="20")

julia> kd = Base.PCRE.capture_names(m.regex.regex)
Dict{Int64,String} with 3 entries:
  2 => "Last_Name"
  3 => "Age"
  1 => "First_Name"

julia> map(eachindex(m.captures)) do i
         get(kd, i, i) => m.captures[i]
       end |> Dict
Dict{String,SubString{String}} with 3 entries:
  "First_Name" => "John"
  "Last_Name" => "Smith"
  "Age" => "20"

julia> map(eachindex(m.captures)) do i
         Symbol(get(kd, i, i)) => m.captures[i]
       end |> x -> (; x...)
(First_Name = "John", Last_Name = "Smith", Age = "20")

```

It should work on all versions from 1.3 to 1.7. Probably it works on 1.0, just hasn’t test it, since do not have 1.0 available.

---

<div class="post-metadata">

**Author:** ![oxinabox](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oxinabox/32/206603_2.png) [@oxinabox](https://discourse.julialang.org/u/oxinabox)\
**Post date:** [April 26, 2021, 8:42am UTC](https://discourse.julialang.org/t/packages-for-text-matching/60012/13 "2021-04-26T08:42:05Z")

</div>

Adding `keys(::RegexMatch)` is indeed 1.7  
[https://github.com/JuliaLang/julia/pull/37299](https://github.com/JuliaLang/julia/pull/37299)

Also in 1.7 we added `iterate(::RegexMatch)` (rather than neededing to do `m.captures`)  
[https://github.com/JuliaLang/julia/pull/34355](https://github.com/JuliaLang/julia/pull/34355)

---

<div class="post-metadata">

**Author:** ![Lincoln\_Hannah](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lincoln_hannah/32/19198_2.png) [@Lincoln\_Hannah](https://discourse.julialang.org/u/Lincoln_Hannah)\
**Post date:** [April 26, 2021, 8:43am UTC](https://discourse.julialang.org/t/packages-for-text-matching/60012/14 "2021-04-26T08:43:53Z")

</div>

Will upgrade:)

---

<div class="post-metadata">

**Author:** ![oxinabox](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oxinabox/32/206603_2.png) [@oxinabox](https://discourse.julialang.org/u/oxinabox)\
**Post date:** [April 26, 2021, 8:45am UTC](https://discourse.julialang.org/t/packages-for-text-matching/60012/15 "2021-04-26T08:45:40Z")

</div>

1.7 hasn’t been released yet, and is many months away from releasing.  
Compat.jl might have these functions.  
if not you can open an issue (or a PR even) to port them across from those JuliaLang/Julia PRs.

---

<div class="post-metadata">

**Author:** ![Lincoln\_Hannah](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lincoln_hannah/32/19198_2.png) [@Lincoln\_Hannah](https://discourse.julialang.org/u/Lincoln_Hannah)\
**Post date:** [April 26, 2021, 8:49am UTC](https://discourse.julialang.org/t/packages-for-text-matching/60012/16 "2021-04-26T08:49:14Z")

</div>

Thanks
