2008-11-03 59 views
19

ok vì vậy về cơ bản tôi hỏi câu hỏi về tên của họ Tôi muốn đây là một đầu vào thay vì Tên và Họ.Tách tên của một người vào tên và họ

Bây giờ có cách nào để tách tên này không? và chỉ lấy từ cuối cùng từ "Câu", ví dụ:

name = "Thomas Winter" 
print name.split() 

và những gì sẽ là đầu ra chỉ là "Mùa đông"

Trả lời

1

Như thế này:

print name.split()[-1] 
+0

in name.split () [- 1] thông báo() – Jake

+0

Xin lỗi. Tôi hơi bị tổn thương bởi Ruby. – JesperE

0

bạn có thể muốn sử dụng rsplit cho việc này:

rsplit ([Tháng Chín [, maxsplit]])

Trả về danh sách các từ trong chuỗi, sử dụng sep làm chuỗi phân cách. Nếu maxsplit được đưa ra, tại hầu hết các phần tách tối đa được thực hiện, các phần tách bên phải. Nếu sep không được chỉ định hoặc None, thì bất kỳ chuỗi khoảng trống nào cũng là một dấu tách. Ngoại trừ việc tách từ bên phải, rsplit() hoạt động như split() được mô tả chi tiết bên dưới. Tính năng mới trong phiên bản 2.4.

14

Vấn đề với việc cố gắng tách tên khỏi một đầu vào duy nhất là bạn sẽ không nhận được họ đầy đủ cho những người có không gian trong họ của họ và tôi không tin rằng bạn có thể viết mã để quản lý điều đó hoàn toàn.

Tôi khuyên bạn nên hỏi tên riêng nếu hoàn toàn có thể.

+0

Đồng ý, điều gì về nói, Mike St. James chẳng hạn? Họ không chính xác sẽ được trả lại. – Fry

+0

Anne Marie van Guido. Đâu là tên đầu tiên dừng lại và tên cuối cùng bắt đầu ?! Nhân loại! –

+0

Chưa kể đến các nền văn hóa có tên gia đình được đặt trước. Yêu cầu tên cùng một lúc là OK miễn là bạn luôn coi nó như một đơn vị duy nhất. Cố gắng để chia nó thường sẽ dẫn đến mangling một số trường hợp. – Brian

2

Tách tên khó hơn. Một số tên có hai từ cuối cùng; một số người sẽ nhập tên, họ và tên; một số tên có hai tên công việc đầu tiên. Cách đáng tin cậy hơn (hoặc ít đáng tin cậy nhất) để xử lý tên là luôn ghi lại họ và tên trong các trường riêng biệt. Tất nhiên điều này làm tăng các vấn đề của riêng mình, như cách xử lý những người chỉ có một tên, đảm bảo nó hoạt động cho những người dùng có thứ tự các phần tên khác nhau.

Tên khó, xử lý cẩn thận.

0

Here's how to do it in SQL. Nhưng bình thường hóa dữ liệu với loại điều này thực sự là một con gấu. Tôi đồng ý với Dave DuPlantis về việc yêu cầu đầu vào riêng.

59

Bạn sẽ thấy rằng vấn đề chính của bạn với cách tiếp cận này không phải là một kỹ thuật, nhưng một con người - những người khác nhau viết tên của họ theo những cách khác nhau.

Thực tế, thuật ngữ "tên" và "họ" là thiếu sót.

Trong khi nhiều gia đình pha trộn sử dụng tên gia đình được gạch nối, chẳng hạn như Smith-Jones, có một số người chỉ sử dụng cả hai tên riêng biệt, "Smith Jones", cả hai tên đều là họ của gia đình.

Nhiều tên gia đình châu Âu có nhiều phần, chẳng hạn như "de Vere" và "van den Neiulaar". Đôi khi những tính năng bổ sung này có lịch sử gia đình quan trọng - ví dụ, một tiền tố được vua trao tặng hàng trăm năm trước.

Vấn đề phụ: Tôi viết hoa chính xác những người tôi đang tham khảo - "de" và "van den" không nhận được thư nháp cho một số gia đình nhưng làm cho người khác.

Ngược lại, nhiều nền văn hóa châu Á đặt tên gia đình đầu tiên, bởi vì gia đình được coi là quan trọng hơn cá nhân.

Điểm cuối cùng - một số người đặt cửa hàng tuyệt vời là "Junior" hoặc "Senior" hoặc "III" - và mã của bạn không nên coi đó là tên gia đình.

Cũng lưu ý rằng có một số hợp lý của những người sử dụng một tên đó không phải là một ban của cha mẹ, tôi đã sử dụng các chương trình sau đây với một số thành công:

Họ và tên (như bình thường bằng văn bản để giải quyết thư); Tên gia đình; Được gọi là (tên thường được sử dụng trong cuộc trò chuyện).

ví dụ:

Họ và tên: William Gates III; Họ: Gates; Được gọi là: Bill

Họ và tên: Soong Li; Họ: Soong; Được gọi là: Lisa

+1

+1. Đối với các ứng dụng, tôi thường có một trường "tên đầy đủ" và "biệt hiệu", được điền một cách độc lập. Tôi chưa có trường hợp sử dụng cho "tên gia đình", nhưng YMMV. – erickson

+2

+1 - VUI LÒNG đừng quên những người trong chúng ta được cha mẹ chúng tôi may mắn sử dụng một cái tên khác với tên của chúng tôi - Giống như 'J. Edgar Hoover '. Tên pháp lý (và CC, hầu hết thời gian) yêu cầu 'J. Edgar Hoover '; Casual/Nickname/Known-As sẽ là 'Edgar Hoover'. Tên, MI, Họ không cắt. –

+2

Và một số người không có "họ" hoặc "tên gia đình", ví dụ: trong một số nền văn hóa Đông Phi, họ sử dụng tên của cha và tên của ông nội, ví dụ: Tom Dick Harry. Trong một số trường hợp, tên gia đình nằm ở giữa, ví dụ: Anson Maria Elizabeth Chan Fong On-sang. Xem thêm các bài viết trên Wikipedia "tên tiếng Iceland", "tên tiếng Ả Rập" và "Tên trong Đế quốc Nga, Liên Xô và các nước CIS". –

0

Tôi sẽ chỉ định định dạng chuẩn (một số biểu mẫu sử dụng chúng), chẳng hạn như "Vui lòng viết tên của bạn theo số Tên, họ".

Điều này giúp bạn dễ dàng hơn vì tên thường không chứa dấu phẩy. Nó cũng xác minh rằng người dùng của bạn thực sự nhập cả tên và họ.

5

Quy tắc dữ liệu vàng - không được tổng hợp quá sớm - việc dán các trường này lại dễ dàng hơn nhiều so với tách riêng chúng. Hầu hết mọi người cũng có một tên đệm mà nên là một trường tùy chọn. Một số người có rất nhiều tên đệm. Một số người chỉ có one name, một từ. Một số nền văn hóa thường có một từ điển tên đệm, trả tiền tỏ lòng tôn kính cho cây gia đình trở lại đích Golgafrincham Ark.

Bạn không cần giải pháp mã ở đây - bạn cần quy tắc kinh doanh.

4

Một cách dễ dàng để thực hiện chính xác những gì bạn yêu cầu trong python là

name = "Thomas Winter" 
LastName = name.split()[1] 

(lưu ý parantheses trên sự phân chia chức năng cuộc gọi.)

split() tạo ra một danh sách trong đó mỗi phần tử là từ của bạn chuỗi gốc, được phân tách bằng khoảng trắng. Bây giờ bạn có thể lấy phần tử thứ hai bằng cách sử dụng name.split() [1] hoặc phần tử cuối cùng bằng cách sử dụng name.split() [- 1]

Tuy nhiên, như những người khác đã nói, trừ khi bạn chắc chắn bạn đang nhận một chuỗi như "First_Name Last_Name", có rất nhiều vấn đề liên quan.

2

Vì có quá nhiều biến thể khác nhau về cách mọi người viết tên của họ, nhưng dưới đây là cách cơ bản để có được họ/tên thông qua regex.

import re 
p = re.compile(r'^(\s+)?(Mr(\.)?|Mrs(\.)?)?(?P<FIRST_NAME>.+)(\s+)(?P<LAST_NAME>.+)$', re.IGNORECASE) 
m = p.match('Mr. Dingo Bat') 
if(m != None): 
    first_name = m.group('FIRST_NAME') 
    last_name = m.group('LAST_NAME') 
9

Đây là một vấn đề khá cũ nhưng tôi tìm thấy nó tìm kiếm xung quanh cho một giải pháp để phân tích các phần từ một tên chung với nhau.

http://code.google.com/p/python-nameparser/

+2

Nó rất Mỹ-centric (ví dụ như các tiêu đề xuất hiện để bao gồm tất cả các cấp bậc trong lực lượng vũ trang Mỹ) và các mã vốn sản xuất các thông thường vô nghĩa như MacE và MacK và MacHin :-( –

+0

Tôi nghĩ rằng đây là một thư viện trăn lớn Tôi đã bắt đầu viết một phiên bản đơn giản hơn của python-nameparser, trước khi tôi đọc bài viết của bạn. – dlink

1

Đó chắc chắn là một nhiệm vụ phức tạp hơn nó xuất hiện trên bề mặt. Tôi đã viết lên một số thách thức cũng như thuật toán của tôi để giải quyết nó trên blog của tôi.Hãy chắc chắn để kiểm tra dự án Google Code của tôi cho nó nếu bạn muốn phiên bản mới nhất trong PHP:

http://www.onlineaspect.com/2009/08/17/splitting-names/

4

Đây là cách tôi làm điều đó trong ứng dụng của tôi:

def get_first_name(fullname): 
    firstname = '' 
    try: 
     firstname = fullname.split()[0] 
    except Exception as e: 
     print str(e) 
    return firstname 

def get_last_name(fullname): 
    lastname = '' 
    try: 
     index=0 
     for part in fullname.split(): 
      if index > 0: 
       if index > 1: 
        lastname += ' ' 
       lastname += part 
      index += 1 
    except Exception as e: 
      print str(e) 
    return lastname 

def get_last_word(string): 
    return string.split()[-1] 

print get_first_name('Jim Van Loon') 
print get_last_name('Jim Van Loon') 
print get_last_word('Jim Van Loon') 
+0

Xin cảm ơn vì mã: Quan sát: bạn có thể loại bỏ sự cần thiết phải thiết lập chỉ mục với liệt kê - cho chỉ mục, một phần trong liệt kê (fullname.split()). Ngoài ra bạn có thể loại bỏ sự cần thiết cho điều kiện xung quanh + = '', bằng cách sử dụng join. lastname = '' .join (họ) – dlink

+0

'return" ".join (fullname.split() [1:])' thay vì mọi thứ trong 'try ... except'. –

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