2012-11-29 9 views
6

Szukam najbardziej pythonic sposób zastąpienia pierwszego i ostatniego słowa ciąg znaków (robiąc to na podstawie liter nie będzie działać z różnych powodów). Aby pokazać, co próbuję zrobić, oto przykład.Zastąp pierwsze i ostatnie słowo ciągu w sposób najbardziej pythonic

a = "this is the demonstration sentence." 

Chciałbym wynik mojej funkcji Pythona być:

b = "This is the demonstration Sentence." 

Najtrudniejsze jest to, że nie może być miejsca na przedniej lub na końcu łańcucha. Muszę je zachować.

Oto co mam na myśli:

a = " this is a demonstration sentence. " 

Wynik musiałyby być:

b = " This is a demonstration Sentence. " 

byłby również zainteresowany w opinii na temat tego, czy regex zrobi to zadanie lepiej niż metody wbudowane Pythona, lub odwrotnie.

+0

Dlaczego chcesz/potrzeby, aby wykorzystać ostatnie słowo w zdaniu? – martineau

+0

@martineau Może to praca domowa ... ale ja tylko zgaduję :). – lightalchemist

+0

@martineau Bez powodu - Pętlę przez HTML robi bity i kawałki. pisanie wielkimi literami jest pośrednikiem dla tego, co faktycznie robię. – Pat

Odpowiedz

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

plony

This is a demonstration Sentence. 
+0

huh ... co jest nie tak z'^\ s * (\ S) | (\ w) \ S * \ s * $ ', które musisz użyć grup niezapisujących? – Aprillion

+0

@deathApril: Masz rację Uprościliśmy moją odpowiedź: – unutbu

+0

@unutbu Rzecz piękna, dziękuję – Pat

1

Czy to praca dla Ciebie:

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

Co się stanie, jeśli masz '' To jest zdanie zdania. '' – mgilson

+0

W takim przypadku wykonaj 'a = a.replace (left, Left, 1); a = lista (a); ind = a.rfind (po prawej); a = lista (a); a [ind: ind + len (right)] = Right; a = '. join (a) ' – inspectorG4dget

+0

Z a =" To jest zdanie zdania. "kod odpowiedzi generuje" To jest zdanie Zdanie demonstracyjne."ponieważ prawo to" zdanie ". Ponadto, kod komentarza generuje «AttributeError: 'obiekt listy' nie ma atrybutu 'replace'» –

1

Oto rozwiązanie 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. ' 

Niestety, to najlepsze, co mogę zrobić ...

Regex podział:

(?:^\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

podobne do inspectorG4dget, ale wykorzystujące .rsplit() nadając mu maxsplit argumentu, a .capitalize() zamiast.

Uwaga: .split() przyjmuje również opcjonalny argument maxsplit, aby podzielić go z lewej strony.

>>> 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() dzieli tekst od prawej strony, gdzie maxsplit argumentem Informuje, ile dzieli wykonać. Wartość 1 daje jeden "split" z prawej strony.

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

To nie zachowuje białych znaków na początku i na końcu zdania. – 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) 
Powiązane problemy