2011-11-22 14 views
11

Mam plik o nazwie coś typu FILE-1.txt lub FILE-340.txt. Chcę móc uzyskać numer z nazwy pliku. Odkryłem, że mogę używaćJak znaleźć jedną liczbę w ciągu znaków w Pythonie?

numbers = re.findall(r'\d+', '%s' %(filename)) 

aby uzyskać listę zawierającą numer i używać numery [0], aby dostać samą liczbę jako ciąg ... Ale jeśli wiem, że jest tylko jedna liczba, wydaje się okrężne i niepotrzebne sporządzenie listy, aby je zdobyć. Czy jest inny sposób na zrobienie tego?


Edytuj: Dzięki! Chyba teraz mam inne pytanie. Zamiast pobierania ciąg, jak uzyskać liczbę całkowitą?

+2

Czy rozumiem to poprawnie, że przez ''% s'% (nazwa pliku)' konwertujesz ciąg znaków na ciąg znaków? Jeśli 'nazwapliku' jest łańcuchem, to po prostu zamień' '% s '% (nazwa_pliku)' na 'nazwapliku'. – Tadeck

+0

Dodanie do komentarza Tadeck, jeśli 'nazwa_pliku' nie jest łańcuchem to' str (nazwa_pliku) 'jest równoważne' '% s'% nazwa_pliku'. –

Odpowiedz

18

Zastosowanie search zamiast findall:

number = re.search(r'\d+', filename).group() 

Alternatywnie:

number = filter(str.isdigit, filename) 
+1

Chociaż 'filter' jest bardziej podobny do' re.findall' w przypadkach, gdy istnieje wiele grup liczb, np. używając _ "FILE-340-1.txt" _ 'filter' tworzy _" 3401 "_, podczas gdy' re.search' zwraca tylko pierwszą grupę _ "340" _. –

1

Jeśli chcesz, aby program się skuteczne

użyj:

num = filename.split("-")[1][:-4] 

to będzie działać tylko do przykładu, który pokazał

+0

Co robi [1] [: - 4]? – user1058492

+1

To zajmuje drugą część z dzielenia, a następnie wyciąć 4 ostatnie znaki [". ​​Txt"] – Davido

1

Innym sposobem, po prostu dla zabawy:

In [1]: fn = 'file-340.txt' 

In [2]: ''.join(x for x in fn if x.isdigit()) 
Out[2]: '340' 
2

Dodawanie do komentarza FJ, o ile chcesz int, można użyć:

numbers = int(re.search(r'\d+', filename).group()) 
0

w odpowiedzi na nowe pytania można rzucić string do int:

>>>int('123') 
123 
Powiązane problemy