var [1] "a1" "a2" "a3" "a4" here is what I...">

R regex: how to remove "*" only between a group of variables

I have a group of variables var:

> var
[1] "a1" "a2" "a3" "a4"

here is what I want to achieve: with regular expressions and change strings, such as:

 3*a1 + a1*a2 + 4*a3*a4 + a1*a3

to

 3a1 + a1*a2 + 4a3*a4 + a1*a3

Basically, I want to trim the "*", which is not between any values ​​in var. Thank you in advance

+4
source share
4 answers

Can find (?<![\da-z])(\d+)\*replace$1

 (?<! [\da-z] )
 ( \d+ )                       # (1)
 \*

Or, ((?:[^\da-z]|^)\d+)\*for weak approval engines

 (                             # (1 start)
      (?: [^\da-z] | ^ )
      \d+ 
 )                             # (1 end)
 \*

Leading statements are bad anyway.

Test

Regex1:   (?<![\da-z])(\d+)\*
Options:  < none >
Completed iterations:   100  /  100     ( x 1000 )
Matches found per iteration:   2
Elapsed Time:    1.09 s,   1087.84 ms,   1087844 µs


Regex2:   ((?:[^\da-z]|^)\d+)\*
Options:  < none >
Completed iterations:   100  /  100     ( x 1000 )
Matches found per iteration:   2
Elapsed Time:    0.77 s,   767.04 ms,   767042 µs
+3
source

var *, , gsub :

var <- c("a1","a2","a3","a4")
s = "3*a1 + a1*a2 + 4*a3*a4 + a1*a3"
block = paste(var, collapse="|")
pat = paste0("\\b((?:", block, ")\\*)(?=\\b(?:", block, ")\\b)|\\*")
gsub(pat, "\\1", s, perl=T)
## "3a1 + a1*a2 + 4a3*a4 + a1*a3"

IDEONE

regex:

\b((?:a1|a2|a3|a4)\*)(?=\b(?:a1|a2|a3|a4)\b)|\*

:

  • \b -
  • ((?:a1|a2|a3|a4)\*) - 1
    • (?:a1|a2|a3|a4) -
    • \* -
    • (?=\b(?:a1|a2|a3|a4)\b) - , ( , * )
  • | -
  • \* - "" , .
+2

,

gsub('((?:^| )\\d)\\*(\\w)', '\\1\\2', '3*a1 + a1*a2 + 4*a3*a4 + a1*a3')
# [1] "3a1 + a1*a2 + 4a3*a4 + a1*a3"

  • , ( ... )
    • , , (?: ... )
      • ^
      • , |
      • ( \\s)
    • 0-9, \\d.
  • , \\*,
  • ( ... )
    • - \\w.

  • , \\1,
  • , \\2.

.

+1

@alistaire , . , "+". :

> ss <- "3*a1 + a1*a2+4*a3*a4 +2*a1*a3+ 4*a2*a3"
# my modified version
> gsub('((?:^|\\s|\\+|\\-)\\d)\\*(\\w)', '\\1\\2', ss) 
[1] "3a1 + a1*a2+4a3*a4 +2a1*a3+ 4a2*a3"

# alistire's
> gsub('((?:^| )\\d)\\*(\\w)', '\\1\\2', ss)
[1] "3a1 + a1*a2+4*a3*a4 +2*a1*a3+ 4a2*a3"
0

All Articles