# Extracting dates and values from a string

**URL:** <https://discourse.julialang.org/t/extracting-dates-and-values-from-a-string/125401>\
**Category:** General Usage\
**Tags:** strings, parsing\
**Created:** [January 30, 2025, 6:31pm UTC](https://discourse.julialang.org/t/extracting-dates-and-values-from-a-string/125401 "2025-01-30T18:31:49Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![jovansam](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jovansam/32/15023_2.png) [@jovansam](https://discourse.julialang.org/u/jovansam)\
**Post date:** [January 30, 2025, 6:31pm UTC](https://discourse.julialang.org/t/extracting-dates-and-values-from-a-string/125401/1 "2025-01-30T18:31:49Z")

</div>

I would appreciation any guidance. I have the text below and would like to extract all dates and the associated information within “dataX.push()” to end up with for instance: 2023-01-10, 0.0, 0.0, 0.0, 0.0; 2023-01-11, 0.0, 0.01… I figure you should work with Regex or Strings functions but exactly certain of the most workable to do this.

`var data0 = [];\n var data1 = [];\n var data2 = [];\n var data3 = [];\n var data4 = [];\n var data5 = [];\n var title1 = 'Processed grapes (tonn)';\n\n data0.push('2023-01-10');\n data1.push(0.0);\n data2.push(0.0);\n data3.push(0.0);\n data4.push(0.0);\n data5.push(97.6);\n data0.push('2023-01-11');\n data1.push(0.0);\n data2.push(0.0);\n data3.push(0.0);\n data4.push(0.0);\n data5.push(174.7);\n data0.push('2023-08-15');\n // console.log(data1);\n\n\n Highcharts.chart('container`

Edit 1: Thanks everyone! Super excellent solutions. This has been enlightening and very helpful

---

<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:** [January 30, 2025, 7:56pm UTC](https://discourse.julialang.org/t/extracting-dates-and-values-from-a-string/125401/2 "2025-01-30T19:56:56Z")

</div>

Defining `str` as your text above:

```julia
replace.(first.(split.(split(str, "push(")[2:end], ");\n")), "'" => "")

```

produces:

```julia
 "2023-01-10"
 "0.0"
 "0.0"
 "0.0"
 ⋮
 "0.0"
 "0.0"
 "174.7"
 "2023-08-15"

```

---

<div class="post-metadata">

**Author:** ![cshen](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cshen/32/217287_2.png) [@cshen](https://discourse.julialang.org/u/cshen)\
**Post date:** [January 30, 2025, 8:05pm UTC](https://discourse.julialang.org/t/extracting-dates-and-values-from-a-string/125401/3 "2025-01-30T20:05:02Z")

</div>

here’s an alternative using regexes

```julia
reg = r"data\d\.push\((.*?)\)"
map(m->m.captures, eachmatch(reg, text))

```

---

<div class="post-metadata">

**Author:** ![rocco\_sprmnt21](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rocco_sprmnt21/32/20127_2.png) [@rocco\_sprmnt21](https://discourse.julialang.org/u/rocco_sprmnt21)\
**Post date:** [January 30, 2025, 8:39pm UTC](https://discourse.julialang.org/t/extracting-dates-and-values-from-a-string/125401/4 "2025-01-30T20:39:05Z")

</div>

```julia
julia> str="""var data0 = [];\n var data1 = [];\n var data2 = [];\n var data3 = [];\n var data4 = [];\n var data5 = [];\n var title1 = 'Processed grapes (tonn)';\n\n data0.push('2023-01-10');\n data1.push(0.0);\n data2.push(0.0);\n data3.push(0.0);\n data4.push(0.0);\n data5.push(97.6);\n data0.push('2023-01-11');\n data1.push(0.0);\n data2.push(0.0);\n data3.push(0.0);\n data4.push(0.0);\n data5.push(174.7);\n data0.push('2023-08-15');\n
       """
"var data0 = [];\n var data1 = [];\n var data2 = [];\n var data3 = [];\n var data4 = [];\n var data5 = [];\n var title1 = 'Processed grapes (tonn)';\n\n data0.push('2023-01-10');\n data1.push(0.0);\n " ⋯ 76 bytes ⋯ " data5.push(97.6);\n data0.push('2023-01-11');\n data1.push(0.0);\n data2.push(0.0);\n data3.push(0.0);\n data4.push(0.0);\n data5.push(174.7);\n data0.push('2023-08-15');\n \n"

julia> pat=r"\((\d+\.\d+)\)|'(\d+-\d+-\d+)'"
r"\((\d+\.\d+)\)|'(\d+-\d+-\d+)'"

julia> res=String[]
String[]

julia> for (f,l) in eachmatch(pat,str)
           push!(res,something(f,l))
       end

julia> res
13-element Vector{String}:
 "2023-01-10"
 "0.0"
 "0.0"
 "0.0"
 "0.0"
 "97.6"
 "2023-01-11"
 "0.0"
 "0.0"
 "0.0"
 "0.0"
 "174.7"
 "2023-08-15"

```

---

<div class="post-metadata">

**Author:** ![rocco\_sprmnt21](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rocco_sprmnt21/32/20127_2.png) [@rocco\_sprmnt21](https://discourse.julialang.org/u/rocco_sprmnt21)\
**Post date:** [January 30, 2025, 8:48pm UTC](https://discourse.julialang.org/t/extracting-dates-and-values-from-a-string/125401/5 "2025-01-30T20:48:17Z")

</div>

what does the `?` in `(.*?)` do?

---

<div class="post-metadata">

**Author:** ![cshen](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cshen/32/217287_2.png) [@cshen](https://discourse.julialang.org/u/cshen)\
**Post date:** [January 30, 2025, 9:01pm UTC](https://discourse.julialang.org/t/extracting-dates-and-values-from-a-string/125401/6 "2025-01-30T21:01:08Z")

</div>

Makes the \* matching lazy instead of eager.

`\(.*\)` matches 0 or more characters between two parentheses, but it’s eager by default that means that it’s going to match all characters between the first parenthesis it find until the last it finds.  
Adding the ? makes the operator lazy which matches all characters until the first closing parenthesis encountered.  
In short \* matches as many characters as possible that fit the patter, while \*? as few as possible.

---

<div class="post-metadata">

**Author:** ![rocco\_sprmnt21](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rocco_sprmnt21/32/20127_2.png) [@rocco\_sprmnt21](https://discourse.julialang.org/u/rocco_sprmnt21)\
**Post date:** [January 30, 2025, 9:05pm UTC](https://discourse.julialang.org/t/extracting-dates-and-values-from-a-string/125401/7 "2025-01-30T21:05:20Z")

</div>

Thanks for clarifying.  
Can you, using your scheme, exclude the ’ around the dates?

---

<div class="post-metadata">

**Author:** ![cshen](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cshen/32/217287_2.png) [@cshen](https://discourse.julialang.org/u/cshen)\
**Post date:** [January 30, 2025, 9:28pm UTC](https://discourse.julialang.org/t/extracting-dates-and-values-from-a-string/125401/8 "2025-01-30T21:28:11Z")

</div>

```julia
julia> reg = r"push\('?(.*?)'?\)"
r"push\('?(.*?)'?\)"

julia> map(m->m.captures[1], eachmatch(reg, text))
13-element Vector{SubString{String}}:
 "2023-01-10"
 "0.0"
 "0.0"
 "0.0"
 "0.0"
 "97.6"
 "2023-01-11"
 "0.0"
 "0.0"
 "0.0"
 "0.0"
 "174.7"
 "2023-08-15"

```

The extra `'?` before and after the capture group excludes a `'` if present.

---

<div class="post-metadata">

**Author:** ![rocco\_sprmnt21](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rocco_sprmnt21/32/20127_2.png) [@rocco\_sprmnt21](https://discourse.julialang.org/u/rocco_sprmnt21)\
**Post date:** [January 30, 2025, 9:58pm UTC](https://discourse.julialang.org/t/extracting-dates-and-values-from-a-string/125401/9 "2025-01-30T21:58:24Z")

</div>

```julia
reg = r"push\('*(.*?)'*\)"

```

this form should also achieve the same result.  
As far as I know ? after a character indicates 1 or more occurrences of that character, while \* after a character indicates 0 or more occurrences. What is the role of ? in this case.

---

<div class="post-metadata">

**Author:** ![cshen](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cshen/32/217287_2.png) [@cshen](https://discourse.julialang.org/u/cshen)\
**Post date:** [January 30, 2025, 10:02pm UTC](https://discourse.julialang.org/t/extracting-dates-and-values-from-a-string/125401/10 "2025-01-30T22:02:50Z")

</div>

yes, `*` is 0 or more, as many as possible. While `?` is 0 or one, as many as possible.  
It’s the equivelent of “optional” in regexes.  
The `*` version would match the case in which you have multiple `'`.
