python rstrip或通过字符模式删除字符串的结尾

时间:2017-09-22 11:56:12

标签: python strip

我正在尝试删除此列中字符串的结尾。我已经看过如何在一个字符串的末尾对一个特定的字符或一定数量的字符进行rstrip,但是你如何根据一个模式来做呢?

我想删除'team'列中字符串的整个末尾,我们看到小写字母后跟大写字母。然后从大写开始删除。我想要下面的'team'列:

   team                              pts/g
St. Louis RamsSt. Louis             32.875
Washington RedskinsWashington       27.6875
Minnesota VikingsMinnesota          24.9375
Indianapolis ColtsIndianapolis      26.4375
Oakland RaidersOakland              24.375
Carolina PanthersCarolina           26.3125
Jacksonville JaguarsJacksonville    24.75
Chicago BearsChicago                17.0
Green Bay PackersGreen Bay          22.3125
San Francisco 49ersSan Francisco    18.4375
Buffalo BillsBuffalo                20.0

看起来像这样:

   team                              pts/g
St. Louis Rams                      32.875
Washington Redskins                 27.6875
Minnesota Vikings                   24.9375
Indianapolis Colts                  26.4375
Oakland Raiders                     24.375
Carolina Panthers                   26.3125
Jacksonville Jaguars                24.75
Chicago Bears                       17.0
Green Bay Packers                   22.3125
San Francisco 49ers                 18.4375
Buffalo Bills                       20.0

2 个答案:

答案 0 :(得分:5)

您可以使用re.sub(pattern, repl, string)

让我们使用这个正则表达式进行匹配:

([a-z])[A-Z].*?(  )

它匹配小写字符([a-z]),后跟大写字符[A-Z]和任何字符.*?,直到它达到两个空格( )。 小写字符和两个空格位于一个组中,因此在使用\1时,可以使用\2为第一个和re.sub第二个组重新插入它们:

new_text = re.sub(r"([a-z])[A-Z].*?(  )", r"\1\2", text)

您的示例的输出:

   team                              pts/g
St. Louis Rams             32.875
Washington Redskins       27.6875
Minnesota Vikings          24.9375
Indianapolis Colts      26.4375
Oakland Raiders              24.375
Carolina Panthers           26.3125
Jacksonville Jaguars    24.75
Chicago Bears                17.0
Green Bay Packers          22.3125
San Francisco 49ers    18.4375
Buffalo Bills                20.0

这使得空间调整变得混乱。可能与您不相关,但是如果您想用空格替换已擦除的字符,则可以将函数而不是替换字符串传递给re.sub,它将获取Match个对象并返回{{ 1}}:

str

然后像这样使用它(注意我如何将待替换部分放入正则表达式组中):

def replace_with_spaces(match):
    return match.group(1) + " "*len(match.group(2)) + match.group(3)

这会产生:

new_text re.sub(r"([a-z])([A-Z].*?)(  )", replace_with_spaces, text)

答案 1 :(得分:0)

嗯,我不是那么容易的事情:因为空间可能会分开两个应该删除的单词。 我建议,仅针对您的问题,删除也是乞讨的最小结尾。 哼......不太容易解释。 这是一个小功能及其测试:

def smart_rstrip ( s ):
    for i in xrange( 1,len( s )):
        if s.endswith( s[:i] ):
            return s[:-i]
    return s


s = ['St. Louis RamsSt. Louis', 'Washington RedskinsWashingt...]
print '\n'.join( s )
print '\n'.join( map( smart_rstrip,s ))

尝试一下,我会得到你想要的东西......