change to uppercase if character before is an underscore

Issue

I have a string

inputstring = "ini adalah salah satu theme park yang terkenal yaitu __u__n__i__v__e__r__s__a__l __s__t__u__d__i__o , di dalam banyak sekali permainan menarik seperti untuk remaja maupun anak-anak , tempatnya agak panas karena open space , makanan di sini agak mahal jdnya di sarankan untuk makan dulu dan membawa minuman botol untuk bisa di refil ."

I want to replace the character before the underscore to an uppercase such that the output will be

ini adalah salah satu theme park yang terkenal yaitu UNIVERSAL STUDIO , di dalam banyak sekali permainan menarik seperti untuk remaja maupun anak-anak , tempatnya agak panas karena open space , makanan di sini agak mahal jdnya di sarankan untuk makan dulu dan membawa minuman botol untuk bisa di refil .

I would like to use list comprehension if possible.

print(''.join('_' + char.lower() if char.isupper() else char for char in inputstring).lstrip('_'))

UPDATE

Using Tim’s answer works well on a single string but when I tried to put into a function and apply to all rows of a particular column in a dataframe, it does not seem to work. May I know what am I doing wrong here?

def uppercase(text):
    text = re.sub(r'__(\w)', lambda m: m.group(1).upper(), text)
    return text

df['review'] = df['review'].apply(lambda x: uppercase(x))

Here is a snapshot of the output I got after transferring the results to excel:
output

Solution

We can try using re.sub with a callback function, in which we capture __ followed by a single letter which is then uppercased.

inputstring = "ini adalah salah satu theme park yang terkenal yaitu __u__n__i__v__e__r__s__a__l __s__t__u__d__i__o , di dalam banyak sekali permainan menarik seperti untuk remaja maupun anak-anak , tempatnya agak panas karena open space , makanan di sini agak mahal jdnya di sarankan untuk makan dulu dan membawa minuman botol untuk bisa di refil ."
output = re.sub(r'__(\w)', lambda m: m.group(1).upper(), inputstring)
print(output)

This prints:

ini adalah salah satu theme park yang terkenal yaitu UNIVERSAL STUDIO , di dalam banyak sekali permainan menarik seperti untuk remaja maupun anak-anak , tempatnya agak panas karena open space , makanan di sini agak mahal jdnya di sarankan untuk makan dulu dan membawa minuman botol untuk bisa di refil .

Edit:

To do this on a Pandas dataframe column, we can use the above logic with str.replace:

df["review"] = df["review"].str.replace(r'__(\w)', lambda m: m.group(1).upper(), regex=True)

Answered By – Tim Biegeleisen

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published