Velocity Reviews > Regular expressions question

# Regular expressions question

Victor Polukcht
Guest
Posts: n/a

 01-16-2007
I have 2 strings:

"Global etsi3 *200 ok 30 100% 100%
Outgoing"
and
"Global etsi3 * 4 ok 30 100% 100%
Outgoing"

The difference is "*200" instead of "* 4". Is there ability to write a
regular expression that will match both of that strings?

Duncan Booth
Guest
Posts: n/a

 01-16-2007
"Victor Polukcht" <(E-Mail Removed)> wrote:

> I have 2 strings:
>
> "Global etsi3 *200 ok 30 100% 100%
> Outgoing"
> and
> "Global etsi3 * 4 ok 30 100% 100%
> Outgoing"
>
> The difference is "*200" instead of "* 4". Is there ability to write a
> regular expression that will match both of that strings?
>

Yes, ".*" would match both of the strings, but not in a useful way. You'll
have to consider which strings you *don't* want to match as well as which
ones you do and whether you want to extract any information from the
strings or find the ones which match.

But first take a step back and look at the problem as a whole. You didn't
say what you are trying to do, and often people will jump at regular
expressions as the solution when there may be better ways of doing what
they want without writing a regular expression.

What do you really want to do?

Victor Polukcht
Guest
Posts: n/a

 01-16-2007
Actually, i'm trying to get the values of first field (Global) , fourth
(200, 4), and fifth (100%) and sixth (100%).

Everything except fourth is simple.

On Jan 16, 2:59 pm, Duncan Booth <(E-Mail Removed)> wrote:
> "Victor Polukcht" <(E-Mail Removed)> wrote:
> > I have 2 strings:

>
> > "Global etsi3 *200 ok 30 100% 100%
> > Outgoing"
> > and
> > "Global etsi3 * 4 ok 30 100% 100%
> > Outgoing"

>
> > The difference is "*200" instead of "* 4". Is there ability to write a
> > regular expression that will match both of that strings?Yes, ".*" would match both of the strings, but not in a useful way. You'll

> have to consider which strings you *don't* want to match as well as which
> ones you do and whether you want to extract any information from the
> strings or find the ones which match.
>
> But first take a step back and look at the problem as a whole. You didn't
> say what you are trying to do, and often people will jump at regular
> expressions as the solution when there may be better ways of doing what
> they want without writing a regular expression.
>
> What do you really want to do?

Neil Cerutti
Guest
Posts: n/a

 01-16-2007
On 2007-01-16, Victor Polukcht <(E-Mail Removed)> wrote:
> Actually, i'm trying to get the values of first field (Global) , fourth
> (200, 4), and fifth (100%) and sixth (100%).
>
> Everything except fourth is simple.

>>> g = "Global etsi3 * 4 ok 30 100% 100% Outgoing"
>>> import re
>>> r = re.search('\*\s+(\d+)', g)
>>> r.group()

'* 4'
>>> r.group(1)

'4'

--
Neil Cerutti
We're not afraid of challenges. It's like we always say: If you want to go out
in the rain, be prepared to get burned. --Brazillian soccer player

Victor Polukcht
Guest
Posts: n/a

 01-16-2007
The same regular expression should work for another string (with *200).

On Jan 16, 5:40 pm, Neil Cerutti <(E-Mail Removed)> wrote:
> On 2007-01-16, Victor Polukcht <(E-Mail Removed)> wrote:
>
> > Actually, i'm trying to get the values of first field (Global) , fourth
> > (200, 4), and fifth (100%) and sixth (100%).

>
> > Everything except fourth is simple.
> >>> g = "Global etsi3 * 4 ok 30 100% 100% Outgoing"
> >>> import re
> >>> r = re.search('\*\s+(\d+)', g)
> >>> r.group()

> '* 4'
> >>> r.group(1)'4'

>
> --
> Neil Cerutti
> We're not afraid of challenges. It's like we always say: If you want to go out
> in the rain, be prepared to get burned. --Brazillian soccer player

Neil Cerutti
Guest
Posts: n/a

 01-16-2007
On 2007-01-16, Victor Polukcht <(E-Mail Removed)> wrote:
> On Jan 16, 5:40 pm, Neil Cerutti <(E-Mail Removed)> wrote:
>> On 2007-01-16, Victor Polukcht <(E-Mail Removed)> wrote:
>>
>> > Actually, i'm trying to get the values of first field (Global) , fourth
>> > (200, 4), and fifth (100%) and sixth (100%).

>>
>> > Everything except fourth is simple.
>> >>> g = "Global etsi3 * 4 ok 30 100% 100% Outgoing"
>> >>> import re
>> >>> r = re.search('\*\s+(\d+)', g)
>> >>> r.group()

>> '* 4'
>> >>> r.group(1)'4'

>
> The same regular expression should work for another string (with *200).

Sorry about that. It should have been:

r = re.search('\*\s*(\d+)', g)

--
Neil Cerutti

Wolfgang Grafen
Guest
Posts: n/a

 01-16-2007
Victor Polukcht wrote:
> I have 2 strings:
>
> "Global etsi3 *200 ok 30 100% 100%
> Outgoing"
> and
> "Global etsi3 * 4 ok 30 100% 100%
> Outgoing"
>
> The difference is "*200" instead of "* 4". Is there ability to write a
> regular expression that will match both of that strings?
>

---------------------------- x.py begin --------
import re

s1 = "Global etsi3 *200 ok 30 100% 100% Outgoing"
s2 = "Global etsi3 * 4 ok 30 100% 100% Outgoing"

re_m = re.compile( "^"
"(\S+)" # Global
"\s+"
"(\S+)" # etsi3
"\s+"
"((\*)\s*(\d+))" # *200 * 4
"\s+"
"(\S+)" # ok
"\s+"
"(\S+)" # 30
"\s+"
"(\S+)" # 100%
"\s+"
"(\S+)" # 100%
"\s+"
"(\S+)" # Outgoing
"\$"
).match

print "match s1:", re_m(s1).groups()
print "match s2:", re_m(s2).groups()
----------------------------- x.py file end ---------

% python x.py
match s1: ('Global', 'etsi3', '*200', '*', '200', 'ok', '30', '100%', '100%', 'Outgoing')
match s2: ('Global', 'etsi3', '* 4', '*', '4', 'ok', '30', '100%', '100%', 'Outgoing')

Jussi Salmela
Guest
Posts: n/a

 01-16-2007
Victor Polukcht kirjoitti:
> I have 2 strings:
>
> "Global etsi3 *200 ok 30 100% 100%
> Outgoing"
> and
> "Global etsi3 * 4 ok 30 100% 100%
> Outgoing"
>
> The difference is "*200" instead of "* 4". Is there ability to write a
> regular expression that will match both of that strings?
>

If the goal is not to study regular expressions, here's a solution
without them. Not so short, but working.

lst = [
"Global etsi3 *200 ok 30 100% 100%
Outgoing",
"Global etsi3 * 4 ok 30 100% 100%
Outgoing"]

for e in lst:
es = e.split()
if len(es) == 9:
num_val = es[3]
else:
num_val = es[2][1:]
print es[0], num_val, es[-3], es[-2]

Cheers,
Jussi

Victor Polukcht
Guest
Posts: n/a

 01-16-2007
Great thnx. It works.

On Jan 16, 6:02 pm, Wolfgang Grafen <(E-Mail Removed)>
wrote:
> Victor Polukcht wrote:
> > I have 2 strings:

>
> > "Global etsi3 *200 ok 30 100% 100%
> > Outgoing"
> > and
> > "Global etsi3 * 4 ok 30 100% 100%
> > Outgoing"

>
> > The difference is "*200" instead of "* 4". Is there ability to write a
> > regular expression that will match both of that strings?---------------------------- x.py begin --------

> import re
>
> s1 = "Global etsi3 *200 ok 30 100% 100% Outgoing"
> s2 = "Global etsi3 * 4 ok 30 100% 100% Outgoing"
>
> re_m = re.compile( "^"
> "(\S+)" # Global
> "\s+"
> "(\S+)" # etsi3
> "\s+"
> "((\*)\s*(\d+))" # *200 * 4
> "\s+"
> "(\S+)" # ok
> "\s+"
> "(\S+)" # 30
> "\s+"
> "(\S+)" # 100%
> "\s+"
> "(\S+)" # 100%
> "\s+"
> "(\S+)" # Outgoing
> "\$"
> ).match
>
> print "match s1:", re_m(s1).groups()
> print "match s2:", re_m(s2).groups()
> ----------------------------- x.py file end ---------
>
> % python x.py
> match s1: ('Global', 'etsi3', '*200', '*', '200', 'ok', '30', '100%', '100%', 'Outgoing')
> match s2: ('Global', 'etsi3', '* 4', '*', '4', 'ok', '30', '100%', '100%', 'Outgoing')