Hyder Tom
Hyder Tom

Reputation: 373

python replace line text with weired characters

How do I replace the following using python

GSA*HC*11177*NYSfH-EfC*23130303*0313*1*R*033330103298
STEM*333*3001*0030303238
BHAT*3319*33*33377*23330706*031829*RTRCP
NUM4*41*2*My Break Room Place*****6*1133337

I want to replace the all character after first occurence of '*' . All characters must be replace except '*'

Example input:

NUM4*41*2*My Break Room Place*****6*1133337

example output:

NUM4*11*1*11 11111 1111 11111*****1*1111111

Upvotes: 2

Views: 50

Answers (2)

user557597
user557597

Reputation:

Fairly simple, use a callback to return group 1 (if matched) unaltered, otherwise
return replacement 1

Note - this also would work in multi-line strings.
If you need that, just add (?m) to the beginning of the regex. (?m)(?:(^[^*]*\*)|[^*\s])

You'd probably want to test the string for the * character first.

    ( ^ [^*]* \* )           # (1), BOS/BOL up to first *
 |                         # or,
    [^*\s]                   # Not a * nor whitespace

Python

import re

def repl(m):
    if ( m.group(1) ) : return m.group(1)
    return "1"

str = 'NUM4*41*2*My Break Room Place*****6*1133337'

if ( str.find('*') ) :
    newstr = re.sub(r'(^[^*]*\*)|[^*\s]', repl, str)
    print newstr
else :
    print '* not found in string'

Output

NUM4*11*1*11 11111 1111 11111*****1*1111111

Upvotes: 2

mquantin
mquantin

Reputation: 1158

If you want to use regex, you can use this one: (?<=\*)[^\*]+ with re.sub

inputs = ['GSA*HC*11177*NYSfH-EfC*23130303*0313*1*R*033330103298',
'STEM*333*3001*0030303238',
'BHAT*3319*33*33377*23330706*031829*RTRCP',
'NUM4*41*2*My Break Room Place*****6*1133337']
outputs = [re.sub(r'(?<=\*)[^\*]+', '1', inputline) for inputline in inputs]

Regex explication here

Upvotes: 1

Related Questions