Python에서 문자열에서 숫자를 추출하는 방법은 무엇입니까?
문자열에 포함된 숫자를 모두 추출하고 싶습니다.과 정규 표현 중 어느 이 더 요?isdigit()
방??
예:
line = "hello 12 hi 89"
결과:
[12, 89]
양의 정수만 추출하려면 다음을 수행하십시오.
>>> txt = "h3110 23 cat 444.4 rabbit 11 2 dog"
>>> [int(s) for s in txt.split() if s.isdigit()]
[23, 11, 2]
다른 모듈이 필요 없고 regex 미니 언어를 해석(학습)할 필요가 없기 때문에 읽기 쉽기 때문에 regex 예제보다 낫다고 생각합니다.
플로트, 음의 정수 또는 16진수 형식의 정수는 인식되지 않습니다.이러한 제한을 받아들일 수 없는 경우 아래 jmnas의 답변이 유효합니다.
regexp를 사용합니다.
>>> import re
>>> re.findall(r'\d+', "hello 42 I'm a 32 string 30")
['42', '32', '30']
도 42번에서 합니다.bla42bla
쉼표)로b : " ( " , " , " " ) " \b: " 를 사용할 수 .
>>> re.findall(r'\b\d+\b', "he33llo 42 I'm a 32 string 30")
['42', '32', '30']
문자열 리스트가 아닌 번호 리스트로 종료하려면:
>>> [int(s) for s in re.findall(r'\b\d+\b', "he33llo 42 I'm a 32 string 30")]
[42, 32, 30]
조금 늦었지만 과학적 표기법을 고려하도록 정규식을 확장할 수도 있습니다.
import re
# Format is [(<string>, <expected output>), ...]
ss = [("apple-12.34 ba33na fanc-14.23e-2yapple+45e5+67.56E+3",
['-12.34', '33', '-14.23e-2', '+45e5', '+67.56E+3']),
('hello X42 I\'m a Y-32.35 string Z30',
['42', '-32.35', '30']),
('he33llo 42 I\'m a 32 string -30',
['33', '42', '32', '-30']),
('h3110 23 cat 444.4 rabbit 11 2 dog',
['3110', '23', '444.4', '11', '2']),
('hello 12 hi 89',
['12', '89']),
('4',
['4']),
('I like 74,600 commas not,500',
['74,600', '500']),
('I like bad math 1+2=.001',
['1', '+2', '.001'])]
for s, r in ss:
rr = re.findall("[-+]?[.]?[\d]+(?:,\d\d\d)*[\.]?\d*(?:[eE][-+]?\d+)?", s)
if rr == r:
print('GOOD')
else:
print('WRONG', rr, 'should be', r)
다 좋은 거야!
또한 AWS Glue 내장 regex도 확인할 수 있습니다.
정수가 아니라 플로트를 원하시겠죠?이렇게 하겠습니다
l = []
for t in s.split():
try:
l.append(float(t))
except ValueError:
pass
여기에 게재되어 있는 다른 솔루션 중 일부는 음수에서는 동작하지 않습니다.
>>> re.findall(r'\b\d+\b', 'he33llo 42 I\'m a 32 string -30')
['42', '32', '30']
>>> '-3'.isdigit()
False
1개의 숫자만 있는 경우),'hello 12 hi'
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .filter
.
예를 들어 다음과 같습니다.
In [1]: int(''.join(filter(str.isdigit, '200 grams')))
Out[1]: 200
In [2]: int(''.join(filter(str.isdigit, 'Counters: 55')))
Out[2]: 55
In [3]: int(''.join(filter(str.isdigit, 'more than 23 times')))
Out[3]: 23
하지만 조심해!!!:
In [4]: int(''.join(filter(str.isdigit, '200 grams 5')))
Out[4]: 2005
특히 브라질 전화번호에서 스트링의 가면을 제거하는 방법을 찾고 있었는데, 이 글은 답이 없었지만 영감을 주었습니다.제 솔루션은 다음과 같습니다.
>>> phone_number = '+55(11)8715-9877'
>>> ''.join([n for n in phone_number if n.isdigit()])
'551187159877'
다른 패턴을 포착하려면 다른 패턴으로 쿼리하는 것이 좋습니다.
관심 있는 다른 숫자 패턴을 포착하는 모든 패턴을 설정합니다.
(쉼표) 12,300 또는 12,300.00
'[\d]+[.\d]+'
(플랫폼플로트) 0.123 또는 0.123
'[\d]*[.][\d]+'
(정수) 123
'[\d]+'
파이프( | )와 조합하여 여러 또는 조건부로 하나의 패턴으로 만듭니다.
(주의: 복잡한 패턴을 먼저 배치하지 않으면 복잡한 어획량이 전체 어획량을 반환하는 대신 단순한 패턴으로 복잡한 어획량을 반환하게 됩니다).
p = '[\d]+[.,\d]+|[\d]*[.][\d]+|[\d]+'
패턴이 re.search()
반복 가능한 캐치 목록을 반환합니다.마지막으로 대괄호 표기를 사용하여 각 캐치를 인쇄하여 일치 개체에서 일치 개체 반환 값을 선택합니다.
s = 'he33llo 42 I\'m a 32 string 30 444.4 12,001'
if re.search(p, s) is not None:
for catch in re.finditer(p, s):
print(catch[0]) # catch is a match object
반품:
33
42
32
30
444.4
12,001
# extract numbers from garbage string:
s = '12//n,_@#$%3.14kjlw0xdadfackvj1.6e-19&*ghn334'
newstr = ''.join((ch if ch in '0123456789.-e' else ' ') for ch in s)
listOfNumbers = [float(i) for i in newstr.split()]
print(listOfNumbers)
[12.0, 3.14, 0.0, 1.6e-19, 334.0]
아래 Regex를 사용하는 것이 방법입니다.
lines = "hello 12 hi 89"
import re
output = []
#repl_str = re.compile('\d+.?\d*')
repl_str = re.compile('^\d+$')
#t = r'\d+.?\d*'
line = lines.split()
for word in line:
match = re.search(repl_str, word)
if match:
output.append(float(match.group()))
print (output)
과 re.findall(r'\d+', "hello 12 hi 89")
['12', '89']
re.findall(r'\b\d+\b', "hello 12 hi 89 33F AC 777")
['12', '89', '777']
숫자 는 모두 할 수 .\D
★★★★★★★★★★★★★★★★★★:
import re
phone_number = "(619) 459-3635"
phone_number = re.sub(r"\D", "", phone_number)
print(phone_number)
r
r"\D"
raw string의 약자입니다.그것은 필요하다.Python은 이 기능이 없으면\D
탈옥 캐릭터로.
line2 = "hello 12 hi 89" # this is the given string
temp1 = re.findall(r'\d+', line2) # find number of digits through regular expression
res2 = list(map(int, temp1))
print(res2)
안녕,
findall expression을 사용하면 문자열 내의 모든 정수를 숫자로 검색할 수 있습니다.
두 번째 단계에서는 목록 res2를 만들고 문자열에 있는 숫자를 이 목록에 추가합니다.
이것이 도움이 되기를 바란다
디와카르 샤르마님
이 답변에는 스트링에 숫자가 플로트되어 있는 경우도 포함됩니다.
def get_first_nbr_from_str(input_str):
'''
:param input_str: strings that contains digit and words
:return: the number extracted from the input_str
demo:
'ab324.23.123xyz': 324.23
'.5abc44': 0.5
'''
if not input_str and not isinstance(input_str, str):
return 0
out_number = ''
for ele in input_str:
if (ele == '.' and '.' not in out_number) or ele.isdigit():
out_number += ele
elif out_number:
break
return float(out_number)
예외처리를 사용하는 사람이 아무도 추가하지 않았고 플로트에서도 이 답변이 작동하기 때문에 이 답변을 추가합니다.
a = []
line = "abcd 1234 efgh 56.78 ij"
for word in line.split():
try:
a.append(float(word))
except ValueError:
pass
print(a)
출력:
[1234.0, 56.78]
이것을 달성하기 위한 대안으로 아직 아무도 사용을 언급하지 않은 것을 보니 놀랍다.
문자열에서 숫자를 추출하려면 , 와 함께 다음과 같이 사용할 수 있습니다.
from itertools import groupby
my_str = "hello 12 hi 89"
l = [int(''.join(i)) for is_digit, i in groupby(my_str, str.isdigit) if is_digit]
l
음음음같 뭇매하다
[12, 89]
PS:은 단지 이고, 으로 삼을 수 입니다.대안으로서도 사용할 수 있습니다.groupby
이 목표를 달성합니다.그러나 이는 권장되는 솔루션이 아닙니다.이것을 달성하려면 , 리스트 이해에 근거해 fmark의 수용된 회답을 사용해 주세요.str.isdigit
필터로 합니다.
내가 찾은 가장 깨끗한 방법:
>>> data = 'hs122 125 &55,58, 25'
>>> new_data = ''.join((ch if ch in '0123456789.-e' else ' ') for ch in data)
>>> numbers = [i for i in new_data.split()]
>>> print(numbers)
['122', '125', '55', '58', '25']
또는 다음과 같습니다.
>>> import re
>>> data = 'hs122 125 &55,58, 25'
>>> numbers = re.findall(r'\d+', data)
>>> print(numbers)
['122', '125', '55', '58', '25']
@jmnas, 당신의 답변은 좋았지만, 플로트를 찾을 수 없었습니다.저는 CNC 밀로 가는 코드를 해석하기 위한 스크립트를 작성하고 있으며, 정수 또는 플로트가 될 수 있는 X 및 Y 치수를 모두 찾아야 하기 때문에 당신의 코드를 다음과 같이 수정했습니다.발하다수 16진수에서를 통해 ""를 "F"에할 수 .num_char
이 '0x230x23과같은 한다.AC'로 하다.
s = 'hello X42 I\'m a Y-32.35 string Z30'
xy = ("X", "Y")
num_char = (".", "+", "-")
l = []
tokens = s.split()
for token in tokens:
if token.startswith(xy):
num = ""
for char in token:
# print(char)
if char.isdigit() or (char in num_char):
num = num + char
try:
l.append(float(num))
except ValueError:
pass
print(l)
이것들 중 어느 것도 내가 찾아야 할 엑셀과 워드 문서에서의 실제 재무 수치를 다루지 않았기 때문에, 여기 나의 변형이 있다.ints, floats, negative number, currency number(분할시 응답하지 않기 때문에)를 처리하고 소수 부분을 드롭하고 ints만 반환하거나 모든 것을 반환하는 옵션이 있습니다.
쉼표가 3개 숫자 간격으로 표시되지 않고 불규칙하게 나타나는 인도 락스 번호 체계도 취급하고 있습니다.
과학적 표기법이나 예산에서 괄호 안에 들어가는 음수는 다루지 않습니다.양으로 표시됩니다.
날짜도 추출하지 않습니다.문자열로 날짜를 찾는 더 좋은 방법이 있습니다.
import re
def find_numbers(string, ints=True):
numexp = re.compile(r'[-]?\d[\d,]*[\.]?[\d{2}]*') #optional - in front
numbers = numexp.findall(string)
numbers = [x.replace(',','') for x in numbers]
if ints is True:
return [int(x.replace(',','').split('.')[0]) for x in numbers]
else:
return numbers
제가 찾은 최선의 옵션은 다음과 같습니다.숫자를 추출하여 모든 유형의 문자를 제거할 수 있습니다.
def extract_nbr(input_str):
if input_str is None or input_str == '':
return 0
out_number = ''
for ele in input_str:
if ele.isdigit():
out_number += ele
return float(out_number)
str1 = "There are 2 apples for 4 persons"
# printing original string
print("The original string : " + str1) # The original string : There are 2 apples for 4 persons
# using List comprehension + isdigit() +split()
# getting numbers from string
res = [int(i) for i in str1.split() if i.isdigit()]
print("The numbers list is : " + str(res)) # The numbers list is : [2, 4]
언급URL : https://stackoverflow.com/questions/4289331/how-to-extract-numbers-from-a-string-in-python
'programing' 카테고리의 다른 글
JavaScript를 사용하여 Caps Lock이 켜져 있는지 어떻게 알 수 있습니까? (0) | 2022.09.30 |
---|---|
Maria DB가 권장하는 RAM, 디스크, 코어 용량 (0) | 2022.09.30 |
Laravel mysql 마이그레이션 오류 (0) | 2022.09.30 |
Java를 사용하여 파일이 있는 폴더를 삭제하는 방법 (0) | 2022.09.30 |
내비게이션 드로어 항목 아이콘이 원래 색상을 나타내지 않음 (0) | 2022.09.30 |