2012-12-31 13 views
6

Ciąg wejściowy znajduje się poniżej:Python: jak usunąć tylko pierwsze słowo z ciągiem

line = "Cat Jumped the Bridge" 

Wyjście powinno być „przeskoczył Bridge”.

Próbowałem

s2 = re.match('\W+.*', line).group() 

ale zwraca

Traceback (most recent call last): 
    File "regex.py", line 7, in <module> 
    s2 = re.match('\W+.*', line).group() 
AttributeError: 'NoneType' object has no attribute 'group' 

Więc widocznie mecz nie powiodło się.

Dzięki za wszelkie sugestie. Joe

+0

zamiast re.match re.search robi to, czego potrzebowałem. Oznacza to usunięcie pierwszego słowa linii. Jeśli jesteś ciekawy, dlaczego muszę robić takie rzeczy. Jest to w kontekście korzystania z modułu cmd i próbowania zbierania argumentów z linii poleceń. Dziękuję wszystkim, którzy odpowiedzieli. –

Odpowiedz

1

może być prostsze:

line = "Cat Jumped the Bridge" 
s2 = " ".join(line.split()[1:]) 

Korzystanie regex:

line = "Cat Jumped the Bridge" 
s2 = re.sub('^\S+\s+', '', line) 
+0

+1 za to, że to pierwszy :) – RocketDonkey

1

Jeśli nie jesteś przywiązany do wyrażenia regularnego, można zrobić coś takiego:

In [1]: line = "Cat Jumped the Bridge" 

In [2]: s2 = ' '.join(line.split()[1:]) 

In [3]: s2 
Out[3]: 'Jumped the Bridge' 

line.split() pobiera ciąg znaków i dzieli go na białe znaki, zwracając listę zawierającą ns każde słowo jako przedmiotów:

In [4]: line.split() 
Out[4]: ['Cat', 'Jumped', 'the', 'Bridge'] 

Z tej listy, bierzemy drugi element (pomijając pierwsze słowo), a wszystko po to, używając [1:]:

In [5]: line.split()[1:] 
Out[5]: ['Jumped', 'the', 'Bridge'] 

I wtedy ostatni kawałek jest łączenie to wszystko razem za pomocą join, gdzie tu używamy spacji do „przyłączenia” wszystkich ciągów w naszej listy w jeden ciąg:

In [6]: ' '.join(line.split()[1:]) 
Out[6]: 'Jumped the Bridge' 
+0

Kompleks Waay. Użyj parametrów dla podziału! – Moshe

+0

@Moshe Całkowicie o tym zapomniałem - +1 do Ciebie, proszę pana :) – RocketDonkey

4

można również użyć .partition():

>>> line = "Cat Jumped the Bridge" 
>>> word, space, rest = line.partition(' ') 
>>> word 
'Cat' 
>>> space 
' ' 
>>> rest 
'Jumped the Bridge' 

Aby naprawić to, co masz teraz, dodać grupę przechwytywania i użyć \w zamiast \W (są przeciwieństwa):

>>> re.match(r'(\w+)', line).group() 
'Cat' 
+0

+1, zdecydowanie tak lepiej. – RocketDonkey

+0

Blender, dziękuję za odpowiedź. Najwyraźniej już zbyt długo spoglądałem na kodeks. Ponieważ powinienem był wypróbować s2 = re.search ('\ W +. *', Line) .group(). A to dałoby mi to, czego chciałem. Ale zamiast tego miałem reime. Wielkie dzięki. –

10

Pythona split ma opcjonalny drugi parametr zwany maxsplit, Aby określić największą liczbę podziałów:

line = "Cat Jumped the Bridge" 
s2 = line.split(' ', 1)[1] 

Zacytuj dokumentację r str.split:

Zwraca listę słów w łańcuchu, używając sep jako ciągu ogranicznika. Jeśli maxsplit podano, w większości rozłamów maxsplit są wykonywane

więc wyjaśnić ten kod: str.split(' ', 1) tworzy listę z dwóch elementów: pierwszy element jest pierwszym słowem (aż osiągnie miejsca), a drugi będąc resztą ciągu.Aby wyodrębnić tylko resztę ciągu, używamy [1], aby wskazać drugi element.

Uwaga: Jeśli jesteś zaniepokojony o wielu miejscach, użyj None jako pierwszy parametr dla str.split, co następuje:

line = "Cat Jumped the Bridge" 
s2 = line.split(None, 1)[1] 
1

Or .........

words = ["Cat", "Cool", "Foo", "Mate"] 
sentence = "Cat Jumped the Bridge" 

for word in words: 
    if word in sentence: 
     sentence = sentence.replace(word, "", 1) 
     break 

przeciwnym razie ....

sentence = "Cat Jumped the Bridge" 

sentence = sentence.split(" ") 
sentence.pop(0) 
sentence = " ".join(sentence) 
0
def delete_first_word(p): 
    letter = 0 
    for e in p: 
     if e[0] == " ": 
      return line[letter + 1:] 
     else: 
      letter = letter + 1 
line = "Cat Jumped the Bridge" 
print delete_first_word(line) 
Powiązane problemy