python rstrip 或按字符模式删除字符串结尾

python rstrip or remove end of string by a pattern of characters

我正在尝试去除此列中字符串的末尾。我已经了解了如何在字符串末尾删除特定字符或一定数量的字符,但是如何根据模式执行此操作?

我想删除 '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

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

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

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

它匹配一个小写字符 ([a-z]),然后是一个大写字符 [A-Z] 和任何字符 .*?,直到它命中两个 spaces ( )。 小写字符和两个space在一个组中,所以当使用re.sub时,第一组使用</code>,第二组使用<code>重新插入:

new_text = re.sub(r"([a-z])[A-Z].*?(  )", r"", 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

这弄乱了 space-对齐。可能与你无关,但如果你想用 space 替换擦除的字符,你可以将一个函数而不是替换字符串传递给 re.sub,它需要一个 Match 对象和returns一个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)

这会产生:

   team                              pts/g
St. Louis Rams                      32.875
Washington Redskins                 27.687
Minnesota Vikings                   24.937
Indianapolis Colts                  26.437
Oakland Raiders                     24.375
Carolina Panthers                   26.312
Jacksonville Jaguars                24.75
Chicago Bears                       17.0
Green Bay Packers                   22.312
San Francisco 49ers                 18.437
Buffalo Bills                       20.0

好吧,我不认为这很容易:因为可能分隔 2 个单词的空格应该被删除。 我建议,仅针对您的问题,删除也是乞讨的最小结尾。 嗯……不太好解释。 这是一个小函数及其测试:

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 ))

试试吧,我相信你会得到你想要的...