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:
CodePudding user response:
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)