Wyodrębniłbym wszystkie liczby zawarte w ciągu. Który lepiej nadaje się do celu, wyrażeń regularnych lub isdigit()
metody?
Przykład:
line = "hello 12 hi 89"
Wynik:
[12, 89]
Jeśli chcesz wyodrębnić tylko dodatnie liczby całkowite, spróbuj wykonać następujące czynności:
>>> str = "h3110 23 cat 444.4 rabbit 11 2 dog"
>>> [int(s) for s in str.split() if s.isdigit()]
[23, 11, 2]
Argumentowałbym, że jest to lepsze niż przykład wyrażenia regularnego z trzech powodów. Po pierwsze, nie potrzebujesz innego modułu; po drugie, jest bardziej czytelny, ponieważ nie trzeba analizować mini-języka regex; i po trzecie, jest szybszy (a więc prawdopodobnie bardziej pythoniczny):
python -m timeit -s "str = 'h3110 23 cat 444.4 rabbit 11 2 dog' * 1000" "[s for s in str.split() if s.isdigit()]"
100 loops, best of 3: 2.84 msec per loop
python -m timeit -s "import re" "str = 'h3110 23 cat 444.4 rabbit 11 2 dog' * 1000" "re.findall('\\b\\d+\\b', str)"
100 loops, best of 3: 5.66 msec per loop
To nie rozpoznaje liczb zmiennoprzecinkowych, ujemnych liczb całkowitych lub liczb całkowitych w formacie szesnastkowym. Jeśli nie możesz zaakceptować tych ograniczeń, poniższa odpowiedź Slim rozwiąże problem.
re
. Jest to ogólne i potężne narzędzie (dzięki czemu uczysz się czegoś bardzo przydatnego). Szybkość jest w pewnym stopniu nieistotna podczas analizowania dziennika (w końcu nie jest to intensywny solver numeryczny),re
moduł znajduje się w standardowej bibliotece Pythona i ładowanie go nie boli.mumblejumble45mumblejumble
w których wiedziałem, że jest tylko jedna liczba. Rozwiązanie jest po prostuint(filter(str.isdigit, your_string))
.str
która następnie przesłaniastr
obiekt i metodę w podstawowym pythonie. To nie jest dobra praktyka, ponieważ może być potrzebna później w skrypcie.int(filter(...))
podniesieTypeError: int() argument must be a string...
dla Python 3.5, więc możesz użyć zaktualizowanej wersji:int(''.join(filter(str.isdigit, your_string)))
do wyodrębnienia wszystkich cyfr do jednej liczby całkowitej.Użyłbym wyrażenia regularnego:
To również pasuje do 42 z
bla42bla
. Jeśli chcesz tylko liczby rozdzielane granicami słów (spacja, kropka, przecinek), możesz użyć \ b:Aby skończyć z listą liczb zamiast listy ciągów:
źródło
int
go i gotowe. +1, szczególnie w drugiej części. Sugerowałbym jednak nieprzetworzone ciągi (r'\b\d+\b' == '\\b\\d+\\b'
).int_list = [int(s) for s in re.findall('\\d+', 'hello 12 hi 89')]
map
.Jest to więcej niż trochę za późno, ale możesz rozszerzyć wyrażenie regularne, aby uwzględnić również zapis naukowy.
Daje wszystko dobrze!
Dodatkowo możesz spojrzeć na regex wbudowanego kleju AWS
źródło
s = "4"
zwraca żadnych wyników. Czy można ponownie edytować, aby się tym zająć?[+-]?\d*[\.]?\d*(?:(?:[eE])[+-]?\d+)?
grupa ta ma dać kilka fałszywych alarmów (tzn+
zostaje schwytany przez siebie czasami), ale jest w stanie obsłużyć więcej form, takich jak.001
, plus nie łączyć numery automatycznie (jak ws=2+1
)[-+]?[.]?[\d]+(?:,\d\d\d)*[\.]?\d*(?:[eE][-+]?\d+)?
- tak głupie z mojej strony ... jak mogłem o tym nie myśleć?Zakładam, że chcesz liczb zmiennoprzecinkowych nie tylko liczb całkowitych, więc zrobiłbym coś takiego:
Pamiętaj, że niektóre inne opublikowane tutaj rozwiązania nie działają z liczbami ujemnymi:
źródło
float
naint
.re.findall("[-\d]+", "1 -2")
continue
zamiastpass
w pętli?Jeśli wiesz, że będzie to tylko jedna liczba w ciągu, tzn. „Witaj 12 cześć”, możesz spróbować przefiltrować.
Na przykład:
Ale bądź ostrożny !!! :
źródło
TypeError: int() argument must be a string, a bytes-like object or a number, not 'filter'
- naprawienie go za pomocąint("".join(filter(str.isdigit, '200 grams')))
źródło
Szukałem rozwiązania do usuwania masek ciągów, szczególnie z brazylijskich numerów telefonów, ten post nie odpowiedział, ale zainspirował mnie. To jest moje rozwiązanie:
źródło
Używanie Regex poniżej jest sposobem
z findall
re.findall(r'\d+', "hello 12 hi 89")
re.findall(r'\b\d+\b', "hello 12 hi 89 33F AC 777")
źródło
findall()
repl_str = re.compile('\d+.?\d*')
powinno być:repl_str = re.compile('\d+\.?\d*')
Dla odtwarzalnego przykładu z użyciem python3.7re.search(re.compile(r'\d+.?\d*'), "42G").group()
'42G're.search(re.compile(r'\d+\.?\d*'), "42G").group()
'42'Cześć ,
możesz przeszukiwać wszystkie liczby całkowite w ciągu poprzez cyfrę, używając wyrażenia findall.
W drugim kroku utwórz listę res2 i dodaj do niej cyfry znalezione w ciągu
mam nadzieję że to pomoże
Pozdrawiam, Diwakar Sharma
źródło
Ta odpowiedź zawiera także przypadek, gdy liczba jest zmiennoprzecinkowa w ciągu
źródło
Dziwi mnie, że nikt jeszcze nie wspomniał o użyciu
itertools.groupby
jako alternatywy do osiągnięcia tego celu.Możesz użyć
itertools.groupby()
wraz zstr.isdigit()
, aby wyodrębnić liczby z łańcucha jako:Trzymana wartość
l
będzie wynosić:PS: To jest wyłącznie w celu ilustracji, aby pokazać, że jako alternatywa moglibyśmy również
groupby
to osiągnąć. Ale to nie jest zalecane rozwiązanie. Jeśli chcesz to osiągnąć, powinieneś użyć zaakceptowanej odpowiedzi fmark, opartej na używaniu rozumienia listystr.isdigit
jako filtra.źródło
Właśnie dodam tę odpowiedź, ponieważ nikt nie dodał jej za pomocą obsługi wyjątków i ponieważ działa to również dla liczb zmiennoprzecinkowych
Wynik :
źródło
Aby złapać różne wzorce, pomocne jest zapytanie o różne wzorce.
Skonfiguruj wszystkie wzorce, które wychwytują różne wzorce liczbowe:
(wyszukuje przecinki) 12,300 lub 12,300,00
„[\ d] + [., \ d] +”
(wyszukuje liczby zmiennoprzecinkowe) 0.123 lub .123
„[\ d] * [.] [\ d] +”
(znajduje liczby całkowite) 123
„[\ d] +”
Połącz z potokiem (|) w jeden wzór z wieloma lub warunkami warunkowymi .
(Uwaga: Najpierw umieść złożone wzory, w przeciwnym razie proste wzory zwrócą fragmenty złożonego połowu zamiast złożonego zwrotu zwracającego pełny połów).
Poniżej potwierdzimy obecność wzoru
re.search()
, a następnie zwrócimy iterowalną listę połowów. Na koniec wydrukujemy każdy haczyk za pomocą notacji nawiasowej, aby podselektywnie zwrócić wartość obiektu dopasowania z obiektu dopasowania.Zwroty:
źródło
Ponieważ żaden z nich nie dotyczył prawdziwych liczb finansowych w dokumentach Excel i Word, które musiałem znaleźć, oto moja odmiana. Obsługuje liczby całkowite, liczby zmiennoprzecinkowe, liczby ujemne, liczby walut (ponieważ nie odpowiada przy podziale) i ma opcję upuszczenia części dziesiętnej i po prostu zwraca liczby całkowite lub zwraca wszystko.
Obsługuje także system liczb Indian Laks, w którym przecinki pojawiają się nieregularnie, nie co 3 cyfry.
Nie obsługuje notacji naukowej ani liczb ujemnych umieszczonych w nawiasach w budżetach - będzie wyglądać na dodatnie.
Nie wyodrębnia również dat. Istnieją lepsze sposoby wyszukiwania dat w ciągach.
źródło
@jmnas, podobała mi się twoja odpowiedź, ale nie znalazłem pływaków. Pracuję nad skryptem do analizy kodu przechodzącego do frezarki CNC i potrzebowałem znaleźć zarówno X, jak i Y wymiary, które mogą być liczbami całkowitymi lub zmiennoprzecinkowymi, więc dostosowałem twój kod do następującego. Znajduje int, float z dodatnimi i ujemnymi vals. Nadal nie znajduje wartości w formacie szesnastkowym, ale możesz dodać „x” i „A” do „F” do
num_char
krotki i myślę, że sparowałoby to rzeczy takie jak „0x23AC”.źródło
Najlepsza opcja, którą znalazłem, jest poniżej. Wyodrębni liczbę i może wyeliminować dowolny typ znaku.
źródło
W przypadku numerów telefonów możesz po prostu wykluczyć wszystkie znaki inne niż cyfry z \ D w wyrażeniu regularnym:
źródło