2017-09-22 14 views
6

Tôi đang cố gắng xóa phần cuối của chuỗi trong cột này. Tôi đã thấy làm thế nào để rstrip một nhân vật cụ thể, hoặc một số thiết lập các ký tự ở phần cuối của một chuỗi, nhưng làm thế nào để bạn làm điều đó dựa trên một mô hình?răn đuôi trăn hoặc xóa phần cuối của chuỗi bằng một mẫu charachters

Tôi muốn xóa toàn bộ phần cuối của chuỗi trong cột 'team' tại nơi chúng tôi thấy chữ thường, sau đó là chữ hoa. Sau đó, loại bỏ bắt đầu từ chữ hoa. Tôi muốn dưới đây 'team' cột:

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 

trông như thế này:

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 

Trả lời

5

Bạn có thể sử dụng re.sub(pattern, repl, string) cho điều đó.

Hãy sử dụng biểu thức chính quy này cho phù hợp:

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

Nó phù hợp với một nhân vật thường ([a-z]), tiếp theo là một chữ hoa [A-Z] và bất kỳ ký tự .*? cho đến khi nó chạm hai không gian (). Nhân vật chữ thường và hai không gian đang ở trong một nhóm, để họ có thể được tái đưa vào sử dụng \1 cho là người đầu tiên và \2 cho nhóm thứ hai khi sử dụng re.sub:

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

Output ví dụ của bạn:

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 

Điều này làm sai lệch không gian căn chỉnh. Có thể không thích hợp với bạn, nhưng nếu bạn muốn thay thế các ký tự lau với không gian, bạn có thể vượt qua một chức năng thay vì một chuỗi thay thế để re.sub, trong đó có một đối tượng Match và trả về một str:

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

Và sau đó sử dụng nó như thế này (chú ý làm thế nào tôi đặt phần to-be-thay thế vào một regex nhóm quá):

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

này tạo ra:

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 
+0

ya, vấn đề liên kết doesnt. Nhưng cảm ơn cho eplaination quá. Nó rất hữu ích trong việc học cách nó hoạt động. – chitown88

+0

Tôi đã mở rộng câu trả lời để bao gồm cách giữ căn chỉnh – Felk

0

Vâng, tôi không làm điều đó dễ dàng như vậy: vì không gian có thể tách biệt 2 từ cần được loại bỏ. Tôi đề nghị, chỉ cho vấn đề của bạn, để loại bỏ phần đuôi nhỏ nhất cũng là một việc ăn xin. hum ... không dễ giải thích. Đây là một chức năng rất ít và thử nghiệm của nó:

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

Hãy thử nó, tôi điều bạn sẽ nhận được những gì bạn muốn ...

Các vấn đề liên quan