python用weired字符替换行文本

时间:2017-07-18 16:59:20

标签: regex python-3.x line str-replace

如何使用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

我希望在第一次出现' *'之后更换所有字符。 。除了' *'

之外,所有字符都必须替换

示例输入:

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

示例输出:

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

2 个答案:

答案 0 :(得分:2)

相当简单,使用回调来返回组1(如果匹配)不变,否则为
返回替换1

注意 - 这也适用于多行字符串 如果您需要,只需将(?m)添加到正则表达式的开头即可。 (?m)(?:(^[^*]*\*)|[^*\s])

您可能希望首先测试*字符的字符串。

    ( ^ [^*]* \* )           # (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'

输出

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

答案 1 :(得分:1)

如果您想使用正则表达式,可以使用以下内容:(?<=\*)[^\*]+ 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]

正则表达式解释here