我正在尝试删除此列中字符串的结尾。我已经看过如何在一个字符串的末尾对一个特定的字符或一定数量的字符进行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
答案 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 ))
尝试一下,我会得到你想要的东西......