2012-11-29 21 views
6

Tôi đang tìm cách pythonic nhất để thay thế từ đầu tiên và cuối cùng của một chuỗi (làm nó trên cơ sở thư sẽ không hoạt động vì nhiều lý do). Để chứng minh những gì tôi đang cố gắng làm, đây là một ví dụ.Thay thế từ đầu tiên và cuối cùng của chuỗi theo cách Pythonic nhất

a = "this is the demonstration sentence." 

Tôi muốn kết quả của chức năng python của tôi là:

b = "This is the demonstration Sentence." 

Phần khó khăn của nó là có thể có chỗ ở mặt trước hoặc kết thúc chuỗi. Tôi cần những thứ cần được bảo tồn.

Đây là những gì tôi muốn nói:

a = " this is a demonstration sentence. " 

Kết quả sẽ cần phải:

b = " This is a demonstration Sentence. " 

cũng sẽ được quan tâm đến ý kiến ​​về việc có một regex sẽ làm công việc này tốt hơn so với các phương pháp sẵn có của python, hoặc ngược lại.

+0

Tại sao bạn muốn/cần phải tận dụng từ cuối cùng của một câu? – martineau

+0

@martineau Có lẽ đó là bài tập về nhà ... nhưng tôi chỉ đoán thôi :). – lightalchemist

+0

@martineau Không có lý do gì - tôi đang lặp qua HTML làm các bit và phần. viết hoa là một proxy cho những gì tôi đang thực sự làm. – Pat

Trả lời

7
import re 
a = " this is a demonstration sentence. " 
print(re.sub(r'''(?x)  # VERBOSE mode 
      (   # 
      ^   # start of string 
       \s*   # zero-or-more whitespaces 
       \w   # followed by an alphanumeric character 
      )   
      |    # OR 
      (
      \w   # an alphanumeric character 
      \S*   # zero-or-more non-space characters 
      \s*   # zero-or-more whitespaces 
      $    # end of string 
      ) 
      ''', 
      lambda m: m.group().title(), 
      a)) 

sản lượng

This is a demonstration Sentence. 
+0

huh .. điều gì sai về'^\ s * (\ S) | (\ w) \ S * \ s * $ 'mà bạn phải sử dụng các nhóm không chụp? – Aprillion

+0

@deathApril: Bạn đúng – unutbu

+0

@unutbu Một điều làm đẹp, cảm ơn – Pat

1

Liệu tác phẩm này với bạn:

In [9]: a = "this is the demonstration sentence." 

In [10]: left, _, right = a.strip().partition(' ') 

In [11]: mid, _, right = right.rpartition(' ') 

In [12]: Left = left.title() 

In [13]: Right = right.title() 

In [14]: a = a.replace(left, Left, 1).replace(right, Right, 1) 

In [15]: a 
Out[15]: 'This is the demonstration Sentence.' 
+1

Điều gì xảy ra nếu bạn có '" Đây là câu câu. "' – mgilson

+0

Trong trường hợp đó, hãy làm 'a = a.replace (trái, Trái, 1); a = danh sách (a); ind = a.rfind (phải); a = danh sách (a); a [ind: ind + len (phải)] = Đúng; a = ''. join (a) ' – inspectorG4dget

+0

Với a =" Đây là câu câu. "Mã câu trả lời tạo ra 'Đây là câu mô tả câu.'bởi vì đúng là' câu '. Ngoài ra, mã của chú thích tạo ra đối tượng «AttributeError: 'list' không có thuộc tính 'replace'» –

1

Dưới đây là một giải pháp regex:

def cap(m): 
    return m.group(0).title() 

re.sub(r'(?:^\s*\w+)|(?:[^\s]+\s*$)',cap," this is a demonstration sentence. ") 
' This is a demonstration Sentence. ' 

Xin lỗi, đó là tốt nhất mà tôi có thể làm ...

Regex sự cố:

(?:^\s*\w+) #match (optional) whitespace and then 1 word at the beginning of the string 
|    #regex "or" 
(?:[^\s]+\s*$) #match a string of non-whitespace characters followed by (optional) whitespace and the end of the line. 
0

Tương tự như inspectorG4dget, nhưng sử dụng .rsplit() cho nó maxsplit đối số, và .capitalize() để thay thế.

Lưu ý: .split() cũng chấp nhận một đối số tùy chọn maxsplit, để chia nhỏ từ bên trái.

>>> a = " this is a demonstration sentence. " 
>>> part_one, part_two = a.rsplit(" ", 1) 
>>> " ".join([part_one.capitalize(), part_two.capitalize()]) 
'This is the demonstration Sentence.' 

.rsplit() tách văn bản từ bên phải, nơi maxsplit luận nói nó có bao nhiêu chia tách để thực hiện. Giá trị 1 sẽ cung cấp cho bạn một "chia" từ bên phải.

>>> a.rsplit(" ", 1) 
['this is the demonstration', 'sentence.'] 
+0

Điều này không bảo vệ khoảng trống ở đầu và cuối câu. – mgilson

0
sentence = " this is a demonstration sentence. " 
sentence = sentence.split(' ') # Split the string where a space occurs 

for word in sentence: 
    if word: # If the list item is not whitespace 
     sentence[sentence.index(word)] = word.title() 
     break # now that the first word's been replaced, we're done 

# get the last word by traversing the sentence backwards 
for word in sentence[::-1]: 
    if word: 
     sentence[sentence.index(word)] = word.title() 
     break 

final_sentence = ' '.join(sentence) 
Các vấn đề liên quan