简体   繁体   中英

Putting words in parenthesis with regex python

How can I put in brackets / parenthesis some words following another word in python? For 2 words it looks like:

>>> p=re.compile(r"foo\s(\w+)\s(\w+)")
>>> p.sub( r"[\1] [\2]", "foo bar baz")
'[bar] [baz]'

I want for undefined number of words. I came up with this, but it doesn't seem to work.

>>> p=re.compile(r"foo(\s(\w+))*")
>>> p.sub( r"[\2] [\2] [\2]", "foo bar baz bax")
'[bax] [bax] [bax]'

The desired result in this case would be

'[bar] [baz] [bax]'

You may use a solution like

import re

p = re.compile(r"(foo\s+)([\w\s]+)")
r = re.compile(r"\w+")
s = "foo bar baz"
print( p.sub( lambda x: "{}{}".format(x.group(1), r.sub(r"[\g<0>]", x.group(2))), s) )

See the Python demo

The first (foo\\s+)([\\w\\s]+) pattern matches and captures foo followed with 1+ whitespaces into Group 1 and then captures 1+ word and whitespace chars into Group 2.

Then, inside the re.sub , the replacement argument is a lambda expression where all 1+ word chunks are wrapped with square brackets using the second simple \\w+ regex (that is done to ensure the same amount of whitespaces between the words, else, it can be done without a regex).

Note that [\\g<0>] replacement pattern inserts [ , the whole match value ( \\g<0> ) and then ] .

I suggest you the following simple solution:

import re

s = "foo bar baz bu bi porte"
p = re.compile(r"foo\s([\w\s]+)")
p = p.match(s)
# Here: p.group(1) is "bar baz bu bi porte"
#       p.group(1).split is ['bar', 'baz' ,'bu' ,'bi', 'porte']

print(' '.join([f'[{i}]' for i in p.group(1).split()]))  # for Python 3.6+ (due to f-strings)
# [bar] [baz] [bu] [bi] [porte]

print(' '.join(['[' + i + ']' for i in p.group(1).split()]))  # for other Python versions
# [bar] [baz] [bu] [bi] [porte]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM