Regex Group case change

Raju ch.nagaraju008 at gmail.com
Thu Oct 1 18:15:32 EDT 2020


import re
import os
import sys

#word = "7 the world" # 7 The world
#word = "Brian'S" # Brian's
#word = "O'biran"# O'Brian
#word = "Stoke-On-Trent" # Stoke-on-Trent; here i need to lower the case of middle word(i.e -On-)
def wordpattern(word):
     output = ''
     if re.match("^\d+|w*$",word):
            output = word.upper()
     elif re.match("\w+\'\w{1}$",word):
            output = word.capitalize()
     elif re.match("(\d+\w* )(Hello)( \w+)",word))
            group(1)group(2).title()group(3)
     else:
            output.title()


On Thursday, October 1, 2020 at 10:53:16 PM UTC+1, cameron... at gmail.com wrote:
> On 01Oct2020 12:41, Raju <ch.naga... at gmail.com> wrote: 
> >I want to change the case on input string i was able to match using 
> >python regex but couldn't find the way to change the case. 
> > 
> >For example string: 
> >Input: 7Section Hello Jim 
> >output: 7Section hello Jim 
> > 
> >I was doing if statment with regex 
> > 
> >if re.match("(\d+\w* )(Hello)( \w+)",string)): 
> > print(r"(\d+\w* )(Hello)( \w+)","\1\2.lower()\3",string) 
> > 
> >Output was 
> >7Section \2.lower() Jim 
> >Above one is one of the regex i have in function, i have total 6 regex 
> >patterns and i want to keep all in this if elif else statment. It is 
> >matching, but can someone advise how to replace Hello to hello?
> Please paste the _exact_ code you're using to produce the problem. I do 
> not believe the code above generates the output you show. I imagine 
> there's som kind of regexp replacement call in the real code. 
> 
> There's a few things going on in the code above which will cause 
> trouble: 
> 
> Be consistent using "raw strings", which look like r".......". Normal 
> Python string recognise a variety of backslash escaped things, like \n 
> for a newline character. The purpose of a raw string is to disable that, 
> which is important with regular expressions because they also use 
> backslash escapes such as \d for a digit. Try to _always_ use raw 
> strings when working with regular expressions. 
> 
> Your print() call _looks_ like it should be printing the result of a 
> regexp substitute() function call, based on the "\1\2.lower()\3" in the 
> second field. The substitute() syntax does not support embedding str 
> methods in the result, so the .lower() will just be written out 
> directly. To do more complicated things you need to pull out the matched 
> groups and work with them separately, then assemble your desired result. 
> 
> You do not keep the result of the re.match call here:
> if re.match("(\d+\w* )(Hello)( \w+)",string)):
> Traditionally one would write: 
> 
> m = re.match("(\d+\w* )(Hello)( \w+)",string)) 
> if m: 
> 
> and in recent Python (3.8+) you can write: 
> 
> if m := re.match("(\d+\w* )(Hello)( \w+)",string)): 
> 
> This preserves the result fo the match in the variable "m", which you 
> will require if you want to do any work with the result, such as 
> lowercasing something. 
> 
> The matches components of the regexp are available via the .group() 
> method of the match result. So: 
> 
> m.group(1) == "7Section" 
> m.group(2) == "Hello" 
> 
> and to print "Hello" lowercased you might write: 
> 
> m.group(2).lower() 
> 
> Since this looks much like homework we will leave it to you to apply 
> this approach to your existing code. 
> 
> Cheers, 
> Cameron Simpson <c... at cskk.id.au>


More information about the Python-list mailing list