Azzera filtri
Azzera filtri

removing parentheses around digits using regular expressions

4 visualizzazioni (ultimi 30 giorni)
Dear all, I am slowly making progress on my learning of regular expressions. At the moment, I am trying to solve the following problem: replace all occurrences of (n) with n, where n is a number, provided that no alphabetical letter occurs before the first parenthesis. As an example,
str='(2)+p_5*(3)-(0.3)'
would become
2+p_5*3-0.3
I wrote the following
regexprep(str,'(\W)(\()([.012345789]+)(\))','$1$3')
but it does not solves the problem if one of the expressions to change occurs at the beginning as in the example above. More concretely, the answer I get from running this is
(2)+p_5*3-0.3
which is not the expected result.
Thanks in advance for any help
Pat.

Risposta accettata

Matt Fig
Matt Fig il 5 Ott 2012
Modificato: Matt Fig il 5 Ott 2012
regexprep(str,'(\()([\d*\.]+)(\))','$2')
  10 Commenti
Walter Roberson
Walter Roberson il 5 Ott 2012
For example, 1+()*2 the empty string inside the () would match because all parts of \d*\.?\d* are optional, so the expression would be converted to 1+*2
Also, I note that the problem description does not disallow numeric characters before the (), so 1+Henkel2(7)*5 would be converted to 1+Henkel27*5
per isakson
per isakson il 5 Ott 2012
Modificato: per isakson il 6 Ott 2012
Yes.
Assuming the requirement is to match numbers only. The second expression below seems to be closer to a working one. However, what expression is taught in the book?
>> regexprep( '(12),(.12),(12.),(1.2),(.),()' ...
, '\((\d*\.?\d*)\)', '#$1' )
ans =
#12,#.12,#12.,#1.2,#.,#
>> regexprep( '(12),(.12),(12.),(1.2),(.),()' ...
, '\(((\d+\.?\d*)|(\d*\.\d+))\)', '#$1' )
ans =
#12,#.12,#12.,#1.2,(.),()
.
\w takes care of the case with Henkel2 - by intent or not. However, are there any cases, in which "(" should be replaced when preceded by a digit?

Accedi per commentare.

Più risposte (2)

Walter Roberson
Walter Roberson il 5 Ott 2012
Consider using a "look-behind"

per isakson
per isakson il 5 Ott 2012
Modificato: per isakson il 5 Ott 2012
>> regexprep( str, '\(([\d.]+)\)', '$1' )
ans =
2+p_5*3-0.3
str =
(2)+p_5*(3)-(0.3)+exp(3)
>> regexprep( str, '\(([\d.]+)\)', '$1' )
ans =
2+p_5*3-0.3+exp3
  • *\(* represents "("
  • \) represents ")"
  • [\d.]+ represents one or more digits and periods, e.g. "....0" and "2"
  • (expr) "Group regular expressions and capture tokens." The token may be refered to in the replacement string by $1 - "1" because it is the first
Every substring in the string that matches this expression is replaced, i.e. a number enclosed by parentheses is replaced by the number.
.
--- in response to a comment ---
>> regexprep( str, '(?<!\w)\(([\d.]+)\)', '$1' )
ans =
2+p_5*3-0.3+exp(3)
better
>> regexprep( str, '(?<![a-zA-Z])\(([\d.]+)\)', '$1' )
because \w includes digits.
  • (?<![a-zA-Z]) "Look behind from current position and test if expr is not found." Where expr evaluates to a letter. Thus, if preceded by a letter there is no match.
  7 Commenti
Patrick Mboma
Patrick Mboma il 5 Ott 2012
I am currently doing just that, with you guys' help.
Thanks to everybody.
Pat.

Accedi per commentare.

Categorie

Scopri di più su Characters and Strings in Help Center e File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by