brackets content regular expression

N

netimen

I have a text containing brackets (or what is the correct term for
'>'?). I'd like to match text in the uppermost level of brackets.

So, I have sth like: 'aaaa 123 < 1 aaa < t bbb < a <tt > ff > > 2 >
bbbbb'. How to match text between the uppermost brackets ( 1 aaa < t
bbb < a <tt > ff > > 2 )?

P.S. sorry for my english.
 
P

Paul McGuire

I have a text containing brackets (or what is the correct term for
'>'?). I'd like to match text in the uppermost level of brackets.

So, I have sth like: 'aaaa 123 < 1 aaa < t bbb < a <tt  > ff > > 2 >
bbbbb'. How to match text between the uppermost brackets ( 1 aaa < t
bbb < a <tt  > ff > > 2 )?

P.S. sorry for my english.

To match opening and closing parens, delimiters, whatever (I refer to
these '<>' as "angle brackets" when talking about them in this
context, otherwise they are just "less than" and "greater than"), you
will need some kind of stack-based parser. You can write your own
without much trouble - there are built-ins in pyparsing that do most
of the work.

Here is the nestedExpr method:[[['1', 'aaa', ['t', 'bbb', ['a', ['tt'], 'ff']], '2']]]

Note that the results show not the original nested text, but the
parsed words in a fully nested structure.

If all you want is the highest-level text, then you can wrap your
nestedExpr parser inside a call to originalTextFor:
[['< 1 aaa < t bbb < a <tt > ff > > 2 >']]

More on pyparsing at http://pyparsing.wikispaces.com.

-- Paul
 
M

Matimus

I have a text containing brackets (or what is the correct term for
'>'?). I'd like to match text in the uppermost level of brackets.

So, I have sth like: 'aaaa 123 < 1 aaa < t bbb < a <tt  > ff > > 2 >
bbbbb'. How to match text between the uppermost brackets ( 1 aaa < t
bbb < a <tt  > ff > > 2 )?

P.S. sorry for my english.

I think most people call them "angle brackets". Anyway it should be
easy to just match the outer most brackets:
' 1 aaa < t bbb < a <tt > ff > > 2 '

In this case the regular expression is automatically greedy, matching
the largest area possible. Note however that it won't work if you have
something like this: "<first> <second>".

Matt
 
N

netimen

Thank's but if i have several top-level groups and want them match one
by one:

text = "a < b < Ó > d > here starts a new group: < e < f > g >"

I want to match first " b < Ó > d " and then " e < f > g " but not "
b < Ó > d > here starts a new group: < e < f > g "
 
N

netimen

there may be different levels of nesting:

"a < b < Ó > d > here starts a new group: < 1 < e < f > g > 2 >
another group: < 3 >"
 
B

bearophileHUGS

netimen:
Thank's but if i have several top-level groups and want them match one
by one:
text = "a < b < Ó > d > here starts a new group:  < e < f  > g >"

What other requirements do you have? If you list them all at once
people will write you the code faster.

bye,
Bearophile
 
P

Pierre Quentel

there may be different levels of nesting:

"a < b < Ó > d > here starts a new group: < 1 < e < f  > g > 2 >
another group: < 3 >"

Hi,

Regular expressions or pyparsing might be overkill for this problem ;
you can use a simple algorithm to read each character, increment a
counter when you find a < and decrement when you find a > ; when the
counter goes back to its initial value you have the end of a top level
group

Something like :

def top_level(txt):
level = 0
start = None
groups = []
for i,car in enumerate(txt):
if car == "<":
level += 1
if not start:
start = i
elif car == ">":
level -= 1
if start and level == 0:
groups.append(txt[start+1:i])
start = None
return groups

print top_level("a said:
[' b < 0 > d ', ' 1 < e < f > g > 2 ', ' 3 ']

Best,
Pierre
 
M

Matimus

Thank's but if i have several top-level groups and want them match one
by one:

text = "a < b < Ó > d > here starts a new group:  < e < f  > g >"

I want to match first " b < Ó > d " and then " e < f  > g " but not "
b < Ó > d > here starts a new group:  < e < f  > g "

As far as I know, you can't do that with a regular expressions (by
definition regular expressions aren't recursive). You can use a
regular expression to aid you, but there is no magic expression that
will give it to you for free.

In this case it is actually pretty easy to do it without regular
expressions at all:
.... stack = []
.... for i, c in enumerate(text):
.... if c == '<':
.... stack.append(i)
.... elif c == '>':
.... start = stack.pop() + 1
.... if len(stack) == depth:
.... yield text[start:i]
........ print seg
....
b < O > d
e < f > g


Matt
 
N

netimen

Yeah, I know it's quite simple to do manually. I was just interested
if it could be done by regular expressions. Thank you anyway.
Thank's but if i have several top-level groups and want them match one
by one:
text = "a < b < Ó > d > here starts a new group:  < e < f  > g >"
I want to match first " b < Ó > d " and then " e < f  > g " but not "
b < Ó > d > here starts a new group:  < e < f  > g "

As far as I know, you can't do that with a regular expressions (by
definition regular expressions aren't recursive). You can use a
regular expression to aid you, but there is no magic expression that
will give it to you for free.

In this case it is actually pretty easy to do it without regular
expressions at all:

...     stack = []
...     for i, c in enumerate(text):
...         if c == '<':
...             stack.append(i)
...         elif c == '>':
...             start = stack.pop() + 1
...             if len(stack) == depth:
...                 yield text[start:i]
...>>> for seg in get_nested_strings(text):

...  print seg
...
 b < O > d
 e < f  > g

Matt
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top